Legendre_symbol/Legendre_symbol.py

39 lines
1.2 KiB
Python

import sys, re
# Возвращает абсолютно наименьший вычет числа a по модулю числа b
def v(a, b):
r1 = a % b
r2 = r1 - b
return r1 if abs(r1) < abs(r2) else r2
# Считает значение символа Лежандра
def solve(a, p):
stop_i = (p-1)//2 + 1
cnt = sum(1 for i in range(1, stop_i) if v(a*i, p) < 0)
return pow(-1, cnt)
f = re.fullmatch(r'(\d+)/(\d+)', sys.argv[1]).groups()
print(solve(int(f[0]), int(f[1])))
# Более длинное, но подробное решение
# # Вернет систему абсолютно наименьших вычетов числа
# def system(a):
# if a % 2:
# return [i for i in range(-(a-1)//2, (a-1)//2+1)]
# else:
# return [i for i in range(-a//2+1, a//2+1)]
# # Возвращает абсолютно наименьший вычет числа a по модулю числа b
# def v(a, b):
# s = system(b)
# for e in s:
# if a % b == e % b:
# return e
# def legendre(a, p):
# count = 0
# for i in range(1, (p-1)//2+1):
# if v(i*a, p) < 0:
# count += 1
# return pow(-1, count)
# print(legendre(11,347))