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; }