Добавил:
SSU_CSIT
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ПУА / Jacoby
.py 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))
'''
Алгоритм разложения числа на множители похож на алгоритм проверки
числа на простоту.
Будем проверять делимость данного числа 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))
Соседние файлы в папке ПУА