note
sk
<b>Update:Added output and updated the list entries based on [BrowserUk]'s final code example</b> <p>
Thanks for the detailed explanation!<p> Sometimes i get very sloppy when I write. My apologies, i should not have used the word factorize instead i should have used the word 'cancel' out.. Actually I was thinking more in terms removing'like' elements. This is in reference to your code.<p>
In the code that I had, I was removing further cancelable terms<p>
Going back to your example <p>
<c>
{ multiply and divide remaining terms }
5 * 6 * 7
---------
2 * 3
The program I had would have done this before multiplying
5 * 7
-----
1
{result}
35
</c>
Here is a simple implementation of canceling out factorial terms without having to expand the factorials because of the fact <p>
<c>
n!/k! = PI(x) where x goes from (k+1) to (n) assuming n > k; PI(x) stands for product of<p>
<readmore>
</c>
<c>
#!/usr/bin/perl
use strict;
use warnings;
# Numerator and Denominator specified as factorials [BrowserUk]'s example numbers
my @snum = (44_289, 11_800, 10_389, 4570);
my @sden = (56_089, 989, 9_400, 43_300, 2_400);
# old list from previous node
# my @snum = (44_289, 11_800, 10_389, 45_700);
# my @sden = (56_089, 989, 9_400, 43_300, 11_800, 2_400);
#
@snum = sort {$b<=>$a} @snum;
@sden = sort {$b<=>$a} @sden;
my $i = 0;
# Make the arrays equal size
if (@snum < @sden) {
foreach $i (@snum..$#sden) { $snum[$i] = 0;}
} else {
foreach $i (@sden..$#snum) { $sden[$i] = 0;}
}
print +($_,$/) for (@snum);
print $/;
print +($_,$/) for (@sden);
print $/;
my @nexp = ();
my @dexp = ();
# n!/k! = (k+1)..(n) [assuming n > k]
for $i (0..$#snum) {
if ($snum[$i] > $sden[$i]) {
print ("Numerator: Going to push from ", $sden[$i]+1, " to ", $snum[$i],$/);
push (@nexp, (($sden[$i]+1)..$snum[$i]));
} elsif ($sden[$i] > $snum[$i]) {
print ("Denominator: Going to push from ", $snum[$i]+1, " to ", $sden[$i],$/);
push (@dexp, (($snum[$i]+1)..$sden[$i]));
}
}
print ("Length of expanded numerator = ", scalar @nexp, $/);
print ("Length of expanded denominator = ", scalar @dexp, $/);
print ("Total Number of elements = ", scalar @nexp + scalar @dexp, $/);
</c>
</readmore>
<c>
__END__
Denominator: Going to push from 44290 to 56089
Denominator: Going to push from 11801 to 43300
Numerator: Going to push from 9401 to 10389
Numerator: Going to push from 2401 to 4570
Denominator: Going to push from 1 to 989
Length of expanded numerator = 3159
Length of expanded denominator = 44289
Total Number of elements = 47448
</c><p>
Now with the expanded list I would run the GCD program which cancels out even more terms like for example the number <c>11</c> cancels <c>56089</c> in the numerator and cancels <c>2398</c> in the denominator<p>
I hope it is clear now.<p>
The reason I was trying to factor down even further is to avoid computing at <i>very high precision</i> for numbers that are going to be canceled out anyways<p>
Has been a very interesting exercise so far!!! I will keep thinking about this problem as I am sure there should be a way to factor these numbers down further without going GCD route given they have such a nice pattern..after all they are just sequential products!<p>
481987
482851