from random import randint
import math
def fermat(n):
x = math.floor(math.sqrt(n))
y = 0
factors = []
if n == x**2:
factors.append(x)
return factors
else:
x = x + 1
while True:
if x == (n + 1) // 2:
return factors.append(n)
else:
y = math.sqrt(x**2 - n)
if math.floor(y)**2 == (x**2 - n):
factors.append(x+y)
factors.append(x-y)
return factors
else:
x = x + 1
def binexp(a, n, mod=1):
res = 1
while n != 0:
if(n&1):
res = res*a % mod
a = a*a % mod
n = n >> 1
return res
def ftest(n, times):
result = False
for i in range(times):
a = randint(0, n)
if binexp(a, n, n) == a:
result = True
else:
return(False)
return(result)
if __name__ == "__main__":
n = 34649*71473
print(ftest(34649, 11))
print(ftest(71473, 11))
print(ftest(n, 11))
factors = fermat(n);
print(factors);
ZnJvbSByYW5kb20gaW1wb3J0IHJhbmRpbnQKaW1wb3J0IG1hdGgKCmRlZiBmZXJtYXQobik6Cgl4ID0gbWF0aC5mbG9vcihtYXRoLnNxcnQobikpCgl5ID0gMAoJZmFjdG9ycyA9IFtdCglpZiBuID09IHgqKjI6CgkJZmFjdG9ycy5hcHBlbmQoeCkKCQlyZXR1cm4gZmFjdG9ycwoJZWxzZToKCQl4ID0geCArIDEKCXdoaWxlIFRydWU6CgkJaWYgeCA9PSAobiArIDEpIC8vIDI6CgkJCXJldHVybiBmYWN0b3JzLmFwcGVuZChuKQoJCWVsc2U6CgkJCXkgPSBtYXRoLnNxcnQoeCoqMiAtIG4pCgkJCWlmIG1hdGguZmxvb3IoeSkqKjIgPT0gKHgqKjIgLSBuKToKCQkJCWZhY3RvcnMuYXBwZW5kKHgreSkKCQkJCWZhY3RvcnMuYXBwZW5kKHgteSkKCQkJCXJldHVybiBmYWN0b3JzCgkJCWVsc2U6CgkJCQl4ID0geCArIDEKCmRlZiBiaW5leHAoYSwgbiwgbW9kPTEpOgoJcmVzID0gMQoJd2hpbGUgbiAhPSAwOgoJCWlmKG4mMSk6CgkJCXJlcyA9IHJlcyphICUgbW9kCgkJYSA9IGEqYSAlIG1vZAoJCW4gPSBuID4+IDEKCXJldHVybiByZXMKCmRlZiBmdGVzdChuLCB0aW1lcyk6CglyZXN1bHQgPSBGYWxzZQoJZm9yIGkgaW4gcmFuZ2UodGltZXMpOgoJCWEgPSByYW5kaW50KDAsIG4pCgkJaWYgYmluZXhwKGEsIG4sIG4pID09IGE6CgkJCXJlc3VsdCA9IFRydWUKCQllbHNlOgoJCQlyZXR1cm4oRmFsc2UpCglyZXR1cm4ocmVzdWx0KQoJCQppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgoJbiA9IDM0NjQ5KjcxNDczCglwcmludChmdGVzdCgzNDY0OSwgMTEpKQoJcHJpbnQoZnRlc3QoNzE0NzMsIDExKSkKCXByaW50KGZ0ZXN0KG4sIDExKSkKCWZhY3RvcnMgPSBmZXJtYXQobik7CglwcmludChmYWN0b3JzKTsKCQ==