use strict; use warnings; use bigint; # e*x-1 = -b*(p-1)*(q-1) # pq = 320353134631681309556473161605063339987 * 276065138433109647164739983515002720659 #my $pq= 88438332459575713003174419268502556144700924300208596763704599584326505691433; #my $x= 69399065592429616374372553429979240083906900467887630575728849318636934515345; # factor e*x-1 = 4548206561731059768327254034140549457379006535963951645041541597795508777332165264 #my @f= reverse qw(2 2 13 23 43 35941363 3174776518993 17508453722537147 50452863802409212925407001 219350806857289); my $pq= 96436236649188001138471945066857677842570427201821167402703570072037925931699; my $x= 26839753978381511829435712315478035977190439224674628583719899884502784648193; my $e= 0x10001; # omitted 2^10 my @f= reverse qw(2 3 5 19 71359 85451 38156773220407 50972760339314981329 508211599216931138498916563746223); my $tst= getnum(\@f, 0, 0); print "tst=$tst\n"; my $t0= time(); my $mx= 3**@f; for (my $i=0 ; $i<$mx ; $i++) { my $b= getnum(\@f, $i, 0); my $p= 2*getnum(\@f, $i, 1)+1; my $q= 2*getnum(\@f, $i, 2)+1; if ($p*$q==$pq) { print "p=$p\nq=$q\n"; last; } if (($i%2000)==1999) { my $t= time(); my $r= $i/($t-$t0); printf("%10d %8d %8.2f %8d\n", $t, $i, $r, ($mx-$i)/$r); } } sub getnum { my ($f, $i, $n)= @_; my $num= 1; for (my $j= 0 ; $j<@$f ; $j++) { my $m= $i%3; $i = int($i/3); $num *= $f->[$j] if ($m==$n); } return $num; }