Я использую следующий код для нахождения primitive roots по модулю n
в Python:Эффективный поиск примитивных корней по модулю n с использованием Python?
Код:
def gcd(a,b):
while b != 0:
a, b = b, a % b
return a
def primRoots(modulo):
roots = []
required_set = set(num for num in range (1, modulo) if gcd(num, modulo) == 1)
for g in range(1, modulo):
actual_set = set(pow(g, powers) % modulo for powers in range (1, modulo))
if required_set == actual_set:
roots.append(g)
return roots
if __name__ == "__main__":
p = 17
primitive_roots = primRoots(p)
print(primitive_roots)
Выход:
[3, 5, 6, 7, 10, 11, 12, 14]
фрагмент кода, извлеченные из :Diffie-Hellman (Github)
Может ли метод primRoots
быть упрощены или оптимизированы с точки зрения использования памяти и производительности/эффективности?
Обратите внимание, что 'pow' разрешает третий аргумент, по модулю, который намного, намного быстрее, чем ручное применение модуля. – Pete