在sage-math上实现模数函数

时间:2018-05-03 08:55:53

标签: sage

我正在sage jupitar笔记本上实现简单模数功能。功能如下:
Mod 2 (v,b)=(v + b *(q-1)/ 2)mod q mod 2

该功能在圣人中被称为:

def modulus(v,b):  
q=12289   
c=[]  
for i in range(len(v)):      
    c.append(mod(((v[i]+b[i]*(q-1)//2)%q),2))  
return c

该功能执行如下:

dimension = 1024     # degree of polynomials
modulus = 12289 
R.<X> = PolynomialRing(GF(modulus),)      Gaussian field of integers  
Y.<x> = R.quotient(X^(dimension) + 1)   # Cyclotomic field   
pi=Y.random_element()
c=Y.random_element()
xi=Y.random_element()
sj=Y.random_element()
rj=Y.random_element()
gj=Y.random_element()
kj=((pi*c+xi)*(sj*d+rj)+(2*c*gj))

# Now, We are making another list named mon and calling the modulus function

mon=[1,2,6,5,8]      
modulus(kj.list(),mon)

执行上述代码时出现以下错误。

TypeError:&#39; sage.rings.integer.Integer&#39;对象不可调用

1 个答案:

答案 0 :(得分:1)

当您尝试执行Sage翻译为1(3)的操作时,几乎总会发生此类错误。在这种情况下,您重新定义了一些东西!

def modulus(v,b):  

modulus = 12289 

你不能在Python中以这种方式重载事物。 Sage将用该数字替换modulus所指的内容;你的功能现在已经消失了。所以当你这样做时

modulus(kj.list(),mon)

你试图将12289称为函数。

我建议调用你的其他模数modulus1或类似的东西。坚持不懈,这个问题应该消失。祝你好运。