Улучшение обнаружения фи-тоента [закрыто]Python

Программы на Python
Ответить
Anonymous
 Улучшение обнаружения фи-тоента [закрыто]

Сообщение Anonymous »

Я создаю алгоритм для поиска totient для большого числа, на самом деле это хорошо работает с числами типа 2^64, но, кроме того, переменная g вычитается из phi_a, замедляя процесс, потому что длина бита большого числа по мере увеличения становится больше. , разница в длине бит меньше и не увеличивает распространение. Можете ли вы найти лучший способ увеличить шаг g, поскольку число n в записи становится больше? Спасибо за все ответы.
import gmpy2

def check_factorization(n, phi_a, isqrt_func):
"""
Vérifie si (n - phi_a + 1)^2 >= 4n et tente de factoriser n.
Si la factorisation aboutit, retourne (p, q). Sinon, (None, None).
"""
diff = n - phi_a + 1
diff_sqr = diff * diff
if diff_sqr >= 4 * n:
# On calcule le discriminant
disc = diff_sqr - 4 * n
root = isqrt_func(disc)
# Vérifie si la racine est exacte
if root * root == disc:
p = (diff + root) // 2
q = (diff - root) // 2
if p * q == n:
return p, q
return None, None

def optimized_phi_calculation(n):
global count

# Initialisation des constantes
s = gmpy2.isqrt(n)
phi_a = (n - 2 * s) + 1
count = 0

# Références locales pour éviter la surcharge d'appels répétés
powmod = gmpy2.powmod
bit_length = gmpy2.bit_length
isqrt_func = gmpy2.isqrt

while True:
# 1) Calcule x = 2^phi_a mod n
x = powmod(2, phi_a, n)

# 2) Vérifie si on peut factoriser à partir de la valeur courante de phi_a
p, q = check_factorization(n, phi_a, isqrt_func)
if p is not None:
return p, q, phi_a

# 3) Met à jour phi_a en fonction de x
if x == 1:
# Si x == 1, on décrémente phi_a de 1
phi_a -= 1
else:
# Sinon, on décrémente phi_a de bit_length(x) - 1
g = bit_length(x) - 1
phi_a -= g
count += 1

# 4) Par sécurité, on peut éviter d'aller trop loin (optionnel)
if phi_a

Подробнее здесь: https://stackoverflow.com/questions/793 ... -detection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»