sub list_reduce { my ( $top, $bot ) = map [ grep $_ != 1, @$_ ], @_; die "Bad data\n" if ( grep $_ < 1, @$top, @$bot ); OUTER: for my $i ( reverse 0 .. $#$top ) { for my $j ( reverse 0 .. $#$bot ) { ( $top->[ $i ], $bot->[ $j ] ) = reduce( $top->[ $i ], $bot->[ $j ] ); splice @$bot, $j, 1 if $bot->[ $j ] == 1; if ( $top->[ $i ] == 1 ) { splice @$top, $i, 1; next OUTER; } } } return ( $top, $bot ); } sub reduce { my ( $top, $bottom ) = @_; my $gcd = Math::BigInt::bgcd( $top, $bottom ); return ( $top/$gcd, $bottom/$gcd ); } ####