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

ПУА / Jacoby

.py
Скачиваний:
15
Добавлен:
18.08.2022
Размер:
2 Кб
Скачать
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))



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