init
This commit is contained in:
80
testcases/basic-testcases/test13.in
Normal file
80
testcases/basic-testcases/test13.in
Normal file
@ -0,0 +1,80 @@
|
||||
#Pollard Rho
|
||||
def quick_power(x , y , p) :
|
||||
ret = 1
|
||||
while y != 0 :
|
||||
if y % 2 == 1 :
|
||||
ret *= x
|
||||
ret %= p
|
||||
x *= x
|
||||
x %= p
|
||||
y //= 2
|
||||
return ret
|
||||
|
||||
def miller_rabin(x , n) :
|
||||
cnt = 0
|
||||
m = n - 1
|
||||
while m % 2 == 0 :
|
||||
cnt += 1
|
||||
m //= 2
|
||||
x = quick_power(x , m , n)
|
||||
if x == 1 : return True
|
||||
while cnt :
|
||||
cnt -= 1
|
||||
if x == 1 : return False
|
||||
if x == n - 1 : return True
|
||||
x *= x
|
||||
x %= n
|
||||
return x == 1
|
||||
|
||||
def is_prime(x) :
|
||||
if x == 2 or x == 3 or x == 5 or x == 7 or x == 11 or x == 13 or x == 17 or x == 19 or x == 23 or x == 29 or x == 31 or x == 37 : return True
|
||||
if x == 1 or x % 2 == 0 : return False
|
||||
i = 2
|
||||
while i <= 37 :
|
||||
if not miller_rabin(i , x) : return False
|
||||
i += 1
|
||||
return True
|
||||
|
||||
def gcd(x , y) :
|
||||
if y == 0 : return x
|
||||
return gcd(y , x % y)
|
||||
|
||||
def F(n , p , c) : return (n * n + c) % p
|
||||
|
||||
seed = 19260817
|
||||
|
||||
def rand() :
|
||||
seed += seed * 131072
|
||||
seed += seed // 32
|
||||
seed += seed * 4096
|
||||
seed %= 4294967296
|
||||
return seed
|
||||
|
||||
def random(n) : return rand() % n
|
||||
|
||||
def iabs(x) :
|
||||
if x >= 0 : return x
|
||||
else : return -x
|
||||
|
||||
def pollard_rho(n) :
|
||||
#print ("try" , n)
|
||||
if n == 1 : return
|
||||
if is_prime(n) :
|
||||
print(n)
|
||||
return
|
||||
while True :
|
||||
c , p = random(n - 1) + 1 , random(n - 1) + 1
|
||||
q = F(p , n , c)
|
||||
while p != q :
|
||||
g = gcd(iabs(p - q) , n)
|
||||
if g != 1 and g != n :
|
||||
pollard_rho(g)
|
||||
pollard_rho(n // g)
|
||||
return
|
||||
p , q = F(p , n , c) , F(F(q , n , c) , n , c)
|
||||
|
||||
pollard_rho(998244352)
|
||||
print()
|
||||
pollard_rho(809172)
|
||||
print()
|
||||
pollard_rho(151299083768042202434037960)
|
Reference in New Issue
Block a user