mirror of
https://github.com/danog/PrimeModule.git
synced 2024-11-26 20:34:37 +01:00
Fix native factorization
This commit is contained in:
parent
55de0454e9
commit
293b767097
@ -27,15 +27,19 @@ class PrimeModule
|
||||
}
|
||||
}
|
||||
$g = 0;
|
||||
for ($i = 0; $i < 3; $i++) {
|
||||
$q = (rand(0, 127) & 15) + 17;
|
||||
$x = rand(0, 1000000000) + 1;
|
||||
$it = 0;
|
||||
for ($i = 0; $i < 3 || $it < 1000; $i++) {
|
||||
$t = ((rand(0, 127) & 15) + 17) % $what;
|
||||
$x = rand(0, 1 << 31) % ($what - 1) + 1;
|
||||
$y = $x;
|
||||
$lim = 1 << ($i + 18);
|
||||
for ($j = 1; $j <= $lim; $j++) {
|
||||
list($a, $b, $c) = [$x, $x, $q];
|
||||
while ($b != 0) {
|
||||
if (($b & 1) != 0) {
|
||||
++$it;
|
||||
$a = $x;
|
||||
$b = $x;
|
||||
$c = $t;
|
||||
while ($b) {
|
||||
if ($b & 1) {
|
||||
$c += $a;
|
||||
if ($c >= $what) {
|
||||
$c -= $what;
|
||||
@ -48,23 +52,25 @@ class PrimeModule
|
||||
$b >>= 1;
|
||||
}
|
||||
$x = $c;
|
||||
$z = ($x < $y) ? $y - $x : $x - $y;
|
||||
$z = ($x < $y) ? $what + $x - $y : $x - $y;
|
||||
$g = self::gcd($z, $what);
|
||||
if ($g != 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (($j & ($j - 1)) === 0) {
|
||||
if (!($j & ($j - 1))) {
|
||||
$y = $x;
|
||||
}
|
||||
}
|
||||
if ($g > 1) {
|
||||
if ($g > 1 && $g < $what) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$p = $what;
|
||||
|
||||
return min($p, $g);
|
||||
if ($g > 1 && $g < $what) {
|
||||
return $g;
|
||||
}
|
||||
return $what;
|
||||
}
|
||||
|
||||
public static function native($what)
|
||||
@ -80,10 +86,10 @@ class PrimeModule
|
||||
public static function python_single($what)
|
||||
{
|
||||
if (function_exists('shell_exec')) {
|
||||
$res = trim(shell_exec('timeout 10 python '.__DIR__.'/prime.py '.$what.' 2>&1'));
|
||||
$res = trim(shell_exec('timeout 10 python2 '.__DIR__.'/prime.py '.$what.' 2>&1'));
|
||||
if ($res == '' || is_null($res) || !is_numeric($res)) {
|
||||
copy(__DIR__.'/prime.py', getcwd().'/.prime.py');
|
||||
$res = trim(shell_exec('timeout 10 python '.getcwd().'/.prime.py '.$what.' 2>&1'));
|
||||
$res = trim(shell_exec('timeout 10 python2 '.getcwd().'/.prime.py '.$what.' 2>&1'));
|
||||
unlink(getcwd().'/.prime.py');
|
||||
if ($res == '' || is_null($res) || !is_numeric($res)) {
|
||||
return false;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import sys
|
||||
from math import log
|
||||
from argparse import ArgumentParser
|
||||
|
||||
# Multiple Polynomial Quadratic Sieve
|
||||
def mpqs(n, verbose=False):
|
||||
@ -308,7 +308,8 @@ def mod_sqrt(n, p):
|
||||
|
||||
#integer sqrt of n
|
||||
def isqrt(n):
|
||||
c = n*4/3
|
||||
n = int(n)
|
||||
c = int(n*4/3)
|
||||
d = c.bit_length()
|
||||
|
||||
a = d>>1
|
||||
@ -321,10 +322,10 @@ def isqrt(n):
|
||||
|
||||
if x != y:
|
||||
x = y
|
||||
y = (x + n/x) >> 1
|
||||
y = int(x + n/x) >> 1
|
||||
while y < x:
|
||||
x = y
|
||||
y = (x + n/x) >> 1
|
||||
y = int(x + n/x) >> 1
|
||||
return x
|
||||
|
||||
# strong probable prime
|
||||
@ -496,12 +497,4 @@ def next_prime(n):
|
||||
return i
|
||||
i += o
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser =ArgumentParser(description='Uses a MPQS to factor a composite number')
|
||||
parser.add_argument('composite', metavar='number_to_factor', type=long,
|
||||
help='the composite number to factor')
|
||||
parser.add_argument('--verbose', dest='verbose', action='store_true',
|
||||
help="enable verbose output")
|
||||
args = parser.parse_args()
|
||||
|
||||
print mpqs(args.composite)
|
||||
print(mpqs(int(sys.argv[1])))
|
||||
|
Loading…
Reference in New Issue
Block a user