Я создаю алгоритм для поиска 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
Улучшение обнаружения фи-тоента [закрыто] ⇐ Python
Программы на Python
1735119902
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79306822/improve-phi-totient-detection[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия