Реализация функции модуля на мудреца - PullRequest
0 голосов
/ 03 мая 2018

Я реализую простую функцию модуля на ноутбуке 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: объект 'sage.rings.integer.Integer' не может быть вызван

1 Ответ

0 голосов
/ 04 мая 2018

Такая ошибка почти всегда возникает, когда вы пытаетесь сделать что-то, что Sage переводит как 1(3). В этом случае вы что-то переопределили!

def modulus(v,b):  

против

modulus = 12289 

Вы не можете перегружать вещи таким образом в Python. Мудрец заменит то, что modulus обозначает на это число; ваша функция только что ушла. Итак, когда вы делаете

modulus(kj.list(),mon)

вы пытаетесь вызвать 12289 как функцию.

Я предлагаю назвать ваш другой модуль modulus1 или что-то в этом роде. Делайте это последовательно, и эта проблема должна исчезнуть. Удачи.

...