Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПУА / Jacoby

.py
Скачиваний:
2
Добавлен:
18.08.2022
Размер:
2.12 Кб
Скачать
import math
'''
Алгоритм разложения числа на множители похож на алгоритм проверки
числа на простоту.
Будем проверять делимость данного числа n на натуральные числа подряд,
начиная с числа 2.
Если мы находим делитель числа n,
то будем делить число n на данный делитель,
пока число делится на него и добавлять делитель в
список простых делителей.

Перебор также необходимо продолжать до .
Если после окончания этого алгоритма число n не станет равно 1,
то оставшееся значение также является простым,
так как не делится ни на одно число, не превосходящее корня
из оставшегося значения, поэтому его нужно добавить к
списку простых делителей:
'''
#Раскладываем число на простые множители
def Factor(n):
Ans = []
d = 2
while d * d <= n:
if n % d == 0:
Ans.append(d)
n //= d
else:
d += 1
if n > 1:
Ans.append(n)
return Ans

#Квадратные вычеты
def quadratic_residues(p):
residue = list(range(1, p))
quadratic_residue = set(map(lambda x : (x % p)**2 % p, residue))
return quadratic_residue

def symbol_Legendre(a, p):
if a % p == 0:
return 0
else:
l = quadratic_residues(p)
if a in l:
return 1
else:
return -1

def symbol_Jacoby(a, l):
symbol = 1
for p in l:
p_i = symbol_Legendre(a, p)
symbol *= p_i
return symbol


a = int(input('a = '))
p = int(input('p = '))

multipliers_of_p = Factor(p)

print(symbol_Jacoby(a, multipliers_of_p))



Соседние файлы в папке ПУА