All pastes #631044 Raw Edit

Untitled

public text v1 · immutable
#631044 ·published 2007-07-23 17:41 UTC
rendered paste body
use Integer;

print solve(1,1,5,-4,1);

# 1/a_1+..+1/a_n=q/r, a_1+...a_n=s*n+t
# n=0 only if q=0 t=0
# let m=min a_i, then m<=k where k=s-1 for t<0, k=s+t for t>=0
# no solution if 1/k>q/r <=> r>(k*q)

sub solve($$$$$) {
    my ($q,$r,$s,$t,$pmin) = @_;
    return () if ($q<0);
    return ("") if (($q==0)&&($t==0));
    return () if (($q==0)&&($t!=0));
    my $k = ($t<0)?($s-1):($s+$t);
    return () if ($r>$k*$q);
    my @st;
    for (my $i=$pmin;$i<=$k;$i++) {
	my @rs = solve($q*$i-$r,$r*$i,$s,$t+$s-$i,$i);
	push @st, map { "(1/$i)".(($_ eq "")?"=1\n":"+$_"); } @rs;
    }
    return @st;
}