Ошибка типа: неподдерживаемые типы операндов для &: 'sage.rings.rational.Rational' и 'int' - PullRequest
0 голосов
/ 24 апреля 2018

Итак, для моего курса по криптографии нам дали задание, и по задаче 1 мы должны были написать в оставшейся части функции для теста примитивности Соловая-Штрассена, и вот что я выписал:

def SolovayStrassen(n,k):
    for i in [1..k]:
        a = randint(2,n-1) #picks a random number between 2 and n-1
        j = jacobi_symbol(a,n) #computes jacobi function
        p = power_mod(a,(n-1)/2,n) #uses the power mod function 
        #now we test if both are equal to find if both are equal in order to check if the number is "composite" or "probably prime"
        if (j != p):
            return False #"composite"
    return True #"probably prime"

Сейчасимейте в виду, что это выполняется в sage online, но когда я запускаю код, он появляется с таким сообщением об ошибке

Error in lines 2-2
Traceback (most recent call last):
  File "/cocalc/lib/python2.7/site-packages/smc_sagews/sage_server.py", line 1013, in execute
    exec compile(block+'\n', '', 'single') in namespace, locals
  File "", line 1, in <module>
  File "", line 5, in SolovayStrassen
  File "/ext/sage/sage-8.1/local/lib/python2.7/site-packages/sage/arith/misc.py", line 1939, in power_mod
    while n&1 == 0:
TypeError: unsupported operand type(s) for &: 'sage.rings.rational.Rational' and 'int'

Похоже, что оно ссылается на эту строку, где ошибка появляется

 p = power_mod(a,(n-1)/2,n) #uses the power mod function 

Я предполагаю, что ошибка может быть в том, что она пытается преобразовать рациональное число в целое число на основе функции power_mod?

1 Ответ

0 голосов
/ 24 апреля 2018

Вам нужно использовать оператор // для целочисленного деления.Оператор / создаст рациональное число в Sagemath, если числитель не делится на знаменатель.Я подозреваю, что ваш алгоритм не следует пытаться использовать даже при значениях n, что является единственным способом, которым эта проблема может проявиться.Даже n обычно рассматриваются как особый случай, потому что их первичность так легко определить.

...