我在python中模拟我的加密方案,我是它的新用户。
p = 512位数,我需要计算它的最大素因子,我正在寻找两件事:
我在其他语言中看到了不同的实现,我的整个代码都在python中,这是我被卡住的最后一点。所以请告诉我python中是否有任何实现。
请简单解释一下,因为我是python的新用户
抱歉英语不好。编辑(取自OP的答案):
#!/usr/bin/env python
def highest_prime_factor(n):
if isprime(n):
return n
for x in xrange(2,n ** 0.5 + 1):
if not n % x:
return highest_prime_factor(n/x)
def isprime(n):
for x in xrange(2,n ** 0.5 + 1):
if not n % x:
return False
return True
if __name__ == "__main__":
import time
start = time.time()
print highest_prime_factor(1238162376372637826)
print time.time() - start
上面的代码对于“1238162376372637826”有效(有点延迟)但是 将其扩展到
10902610991329142436630551158108608965062811746392 57767545600484549911304430471090261099132914243663 05511581086089650628117463925776754560048454991130443047
让python变得疯狂。有没有办法,就像上面一样,我可以拥有它 马上计算出来了吗?
答案 0 :(得分:3)
对于基于Python的解决方案,您可能需要查看pyecm在安装了gmpy的系统上,pyecm发现了以下因素:
101,521,3121,9901,36479,300623,53397071018461,1900381976777332243781
还有一个98位数的无结果复合词:
60252507174568243758911151187828438446814447653986842279796823262165159406500174226172705680274911
使用ECM对剩余的复合材料进行分解可能并不实际。
编辑:几个小时后,剩下的因素是
6060517860310398033985611921721
和
9941808367425935774306988776021629111399536914790551022447994642391
答案 1 :(得分:1)
如果您可以安装扩展程序,gmpy会有所帮助 - 请参阅我对此SO question的回答,特别是我在此处显示的代码中的def prime_factors(x)
函数。
在纯Python(不允许任何扩展)中,它更难,速度慢得多,例如,请参阅代码here(但是当它运行在您的巨大数字上时不要屏住呼吸;-)。
答案 2 :(得分:1)
这应该比大数字的简单方法更合适(尽管使用这种数字处理每个纯Python实现都需要一段时间):Pollard Rho prime factorization。
答案 3 :(得分:0)
('''==============================================================================='''
> ''' CALCULATE HIGHEST PRIME
> FACTOR '''
>
> '''===============================================================================''')
>
> #!/usr/bin/env python
> def highest_prime_factor(n):
> if isprime(n):
> return n
> for x in xrange(2,n ** 0.5 + 1):
> if not n % x:
> return highest_prime_factor(n/x)
> def isprime(n):
> for x in xrange(2,n ** 0.5 + 1):
> if not n % x:
> return False
> return True
> if __name__ == "__main__":
> import time
> start = time.time()
> print highest_prime_factor(1238162376372637826)
> print time.time() - start
代码在数字上有一点延迟:“1238162376372637826”但是 延伸到 (109026109913291424366305511581086089650628117463925776754560048454991130443047109026109913291424366305511581086089650628117463925776754560048454991130443047) 让python变得疯狂。有没有像上面那样的方式,我可以拥有它 马上计算出来。