我决定使用Sagemath,因为我听说它在数论中非常有用。我已经制定了这个程序(这是我的第一个程序)来分解数字,但我不知道为什么它不起作用。我认为这与功能mod的特定属性有关,但我不确定。
有谁知道如何修理它?
谢谢。
#Pollard algorithm
k=87757
f(x)=x^2+1
x=1
y=x
iter=20
i=0
while(i<iter):
i=i+1
x=mod(f(x),k)
y=mod(f(f(y)),k)
g=(x-y).gcd(k)
if(1<g and g<k):
print(g)
print(i)
break
最佳答案
我相信问题确实出在您使用mod
函数上。完成x = mod(f(x), k)
后,x
会驻留在环Z/kZ
中。 g
也是如此。该环中的不等式实际上没有意义,尤其是g<k
将转换为g<0
。这是因为k=0
mod k
,并且当您执行代数运算,相等检查,不相等检查等时,双方都将转换为可用的最佳环。在这种情况下,该环为Z/kZ
。
最好一直使用整数:
x = f(x).mod(k)
y = f(f(y)).mod(k)
这是使用
mod
作为函数或方法的区别:sage: type(5.mod(3)) # method
<type 'sage.rings.integer.Integer'>
sage: type(mod(5, 3)) # function
<type 'sage.rings.finite_rings.integer_mod.IntegerMod_int'>
如果我想将其保存在适用于Sage的Python文件中,则可以这样做:
from sage.rings.all import Integer
def f(x):
# Make sure to return a Sage Integer.
return Integer(x**2+1)
def testing(iter=20):
x=1
y=x
i=0
k=87757
while i<iter:
i=i+1
x=f(x).mod(k)
y=f(f(y)).mod(k)
g=(x-y).gcd(k)
# For debugging:
# print(x, y, g)
if 1<g and g<k:
print(g)
print(i)
break
您可以在函数中添加更多选项:允许输入
k
,x
,y
等。无论如何,然后运行testing(20)
。关于python - 如何修复Sagemath中的mod函数错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54894845/