Алгоритм факторизации ленстры python

Метод Ферма для факторизации чисел в Python

Метод Ферма — это алгоритм факторизации чисел, основанный на разложении квадрата числа на разность квадратов. В данной статье рассматривается пример реализации метода Ферма на языке программирования Python.

Алгоритм метода Ферма

  1. Пусть n — нечетное число, которое нужно разложить на множители.
  2. Выберем x равным ближайшему целому квадратному корню из n: x = ceil(sqrt(n)).
  3. Вычислим квадрат разности: y² = x² — n.
  4. Если y является целым числом, тогда у нас есть факторизация: n = (x — y)(x + y).
  5. Если y не является целым числом, увеличим x на 1 и повторим шаги 3-4, пока не найдем факторизацию.

Реализация на Python

import math def fermat_factorization(n): if n % 2 == 0: return None x = math.ceil(math.sqrt(n)) while True: y_squared = x * x - n y = int(math.sqrt(y_squared)) if y * y == y_squared: return (x - y, x + y) x += 1 if __name__ == "__main__": n = 5959 factors = fermat_factorization(n) if factors: print("Факторы числа", n, ":", factors[0], "и", factors[1]) else: print("Число", n, "четное, метод Ферма неприменим.") 

Заключение

Метод Ферма может быть полезным для факторизации небольших чисел, однако его эффективность снижается с ростом числа n. Для больших чисел существуют другие методы факторизации, такие как метод решета Копперсмита и метод эллиптических кривых Ленстры.

  • Получить ссылку
  • Facebook
  • Twitter
  • Pinterest
  • Электронная почта
  • Другие приложения
Читайте также:  Convert a date from yyyy-mm-dd to dd-mm-yyyy format

Комментарии

Отправить комментарий

Популярные сообщения

Python вывести количество элементов списка

Python: Вывод количества элементов списка В этой статье мы рассмотрим как выводить количество элементов списка с помощью языка программирования Python. Использование функции len() Для определения количества элементов в списке в Python, используйте встроенную функцию len() . my_list = [1, 2, 3, 4, 5] elements_count = len(my_list) print(«Количество элементов в списке:», elements_count) Этот код создает список my_list , а затем использует функцию len() для подсчета элементов в списке. Результат будет выведен на экран. Использование цикла for Если вы хотите подсчитать количество элементов списка без использования функции len() , вы можете использовать цикл for . my_list = [1, 2, 3, 4, 5] elements_count = 0 for _ in my_list: elements_count += 1 print(«Количество элементов в списке:», elements_count) В этом примере мы инициализируем переменную elements_count значением 0, а затем для каждого элемента в списке увел

Python как перевести число в другую систему счисления

Преобразуйте числа как профессионал! Узнайте, как Python может перевести любое число в любую систему счисления. Даже если вы никогда раньше не сталкивались с программированием, эта статья поможет вам стать экспертом в считывании двоичных, восьмеричных и шестнадцатеричных чисел. Не пропустите возможность раскрыть секреты произвольной системы счисления в Python! Python: Перевод числа в другую систему счисления В языке программирования Python преобразование числа в другую систему счисления может быть выполнено с использованием встроенных функций и методов. Преобразование чисел в двоичную систему Python предоставляет встроенную функцию bin() для преобразования числа в двоичную систему. # Пример преобразования числа в двоичную систему num = 18 binary_num = bin(num) print(binary_num) # Вывод: 0b10010 Преобразование чисел в восьмеричную систему Функция oct() в Python преобразует число в восьмеричную систему. # Пример преобразования числа в восьмеричную систему num = 18

Читайте также:  Css selector with class name

Как сделать шашки на python

Как сделать шашки на Python Как сделать шашки на Python В этой статье мы рассмотрим, как создать простую игру в шашки на Python с использованием библиотеки Pygame. Подготовка Для начала установите библиотеку Pygame, используя следующую команду: pip install pygame Создание доски import pygame pygame.init() WIDTH, HEIGHT = 800, 800 ROWS, COLS = 8, 8 SQUARE_SIZE = WIDTH // COLS WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) def draw_board(win): win.fill(WHITE) for row in range(ROWS): for col in range(row % 2, COLS, 2): pygame.draw.rect(win, BLACK, (row * SQUARE_SIZE, col * SQUARE_SIZE, SQUARE_SIZE, SQUARE_SIZE)) def main(): win = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption(«Checkers») clock = pygame.time.Clock() run = True while run: clock.tick(60) for event in pygame.event.get(): if event.ty

Источник

Задачи факторизации эллиптической кривой Ленстры

Я пытаюсь использовать метод факторизации эллиптических кривых Хендрика Ленстра для определения малых (менее 40 бит) составных целых чисел.

import math from fractions import gcd import random def lenstra_elliptic_curve_factor(N): """ Lenstra elliptic curve factoring method """ if N  

Где is_probably_prime() - это тест Миллера-Рабина с числом испытаний, is_probably_prime() 20. Кажется, что для некоторых составных чисел, например 4, он не находит нетривиального gcd(x-x0) , вместо этого алгоритм идет все путь через и ничего не возвращает. Поэтому, когда алгоритм пытается return lenstra_elliptic_curve_factor(int(d)) + lenstra_elliptic_curve_factor(int(N/d)) большее число, которое 4 делит, например 12, return lenstra_elliptic_curve_factor(int(d)) + lenstra_elliptic_curve_factor(int(N/d)) добавляет "NoneType" в список. Например

for x in xrange(0,3241): print x, lenstra_elliptic_curve_factor(x) 
0 [0] 1 [1] 2 [2] 3 [3] 4 None 5 [5] 6 None 7 [7] 8 None 9 [3, 3] 10 [2, 5] 11 [11] 12 Traceback (most recent call last): File "/AVcrypto/util.py", line 160, in print x, lenstra_elliptic_curve_factor(x) File "/Users/Kevin/gd/proj/curr/honproj/AVcrypto/util.py", line 104, in lenstra_elliptic_curve_factor return lenstra_elliptic_curve_factor(int(d)) + lenstra_elliptic_curve_factor(int(N/d)) TypeError: can only concatenate list (not "NoneType") to list 

Я попытался увеличить количество кривых, проверенных на N**10 но, похоже, имеет тот же результат. Мне просто интересно, есть ли у кого-нибудь опыт работы с этим алгоритмом, в частности, когда некоторые числа, похоже, избегают пробного процесса в течение очень долгого времени.

Источник

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Elliptic Curve Factorization

License

NikitaYurasov/ECF

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

Elliptic Curve Factorization

Данный модуль предназначен для нахождения всех делителей числа (факторизация, разложение на простые множители). В качестве метода факторизации используется алгоритм, предложенный Хендриком Ленстрой в 1987 году.

Использование через командную строку

Для использования в терминале достаточно установить пакет:

git clone https://github.com/NikitaYurasov/ECF.git cd ECF

И выполнить следующую команду:

python pyecf -n 9671406556917033397649407

Пакет выложен на PyPi, так что достаточно просто установить его через pip:

Внутри проекта использование может выглядеть так:

from pyecf import LenstraAlgorithm n = 9671406556917033397649407 algo = LenstraAlgorithm(n) factors = algo.factorize() # factors - отсортированный список делителей

Пусть требуется найти делить числа . Считаем, что у числа существует делитель ( ). Сгенерируем тройку чисел для случайной эллиптической кривой над , где и с условием, что кривая не сингулярна ( ). Случайной точкой на кривой выберем .

Пусть также задано число , обозначающее степень, в которое будем возводить начальную точку : , где и -- некоторые целые положительные числа.

Следующим шагом выполняется возведение в степень на выбранной кривой:

, где операция + определена по следующему алгоритму:

Требуется сложить две точки и :

  1. Если , то ; если , то .
  2. Иначе, пусть a. Найти . Если , то -- делитель . Конец алгоритма. b. Если , то НОД дает Конец алгоритма. c. Если , тогда . Требуется найти .
    • Если , -- делитель, конец алгоритма.
    • В противном случае, если , считаем, что , конец алгоритма.
    • Если , то и .

Стоит заметить, что если в ходе алгоритма получается сингулярная кривая, выбор кривой необходимо повторить. Если в ходе алгоритма делитель не нашелся, алгоритм стоит запустить еще раз.

Нахождение всех делителей числа

  1. Пусть заданы два массива: пустой массив для простых делителей и массив с составными делителями. На первом шаге, во втором массиве находится число .
  2. По всем числам из массива составных делителей пока он не пустой:
    • Берем первое число;
    • Проверяем на простоту (тест Миллера-Рабина): если число простое, заносим его в массив простых чисел, и удаляем первое число из массива составных чисел;
    • Если не простое, проверяем на четность: если число четное, в список простых делителей заносим 2, в список составных - в конец;
    • Если не четное, аналогично проверяем делимость на 3;
    • В противном случае используем алгоритм Ленстры для поиска делителя, пока он не будет найден. Когда делитель найден, добавляем его и в список составных делителей в конец.
  3. Результатом алгоритма будут все числа из списка простых делителей.

Время работы данного алгоритма зависит не от самого факторизуемого числа, а то размера наименьшего делителя.

Источник

Оцените статью