Elliptic Curve Factorization
Данный модуль предназначен для нахождения всех делителей числа (факторизация, разложение на простые множители). В качестве метода факторизации используется алгоритм, предложенный Хендриком Ленстрой в 1987 году.
Использование через скрипт
Склонируйте репозиторий, и установите зависимости используя:
git clone https://github.com/NikitaYurasov/ECF.git
cd ECF
poetry install
- pip
git clone https://github.com/NikitaYurasov/ECF.git
cd ECF
pip install -r requirements.txt
И выполните следующую команду:
python pyecf.py -n 9671406556917033397649407 # или любое другое число
Использование как пакет
Установите пакет используя pip (или любой другой менеджер зависимостей)
pip install pyecf
Внутри проекта использование может выглядеть так:
from pyecf import LenstraAlgorithm
n = 9671406556917033397649407
algo = LenstraAlgorithm(n)
factors = algo.factorize() # factors - отсортированный список делителей
Описание алгоритма
Пусть требуется найти делить числа . Считаем, что у числа
существует делитель
(
). Сгенерируем тройку чисел
для случайной эллиптической кривой
над
, где
и с условием, что кривая не сингулярна (
). Случайной точкой на кривой выберем
.
Пусть также задано число , обозначающее степень, в которое будем возводить начальную точку
:
, где
и
-- некоторые целые положительные числа.
Следующим шагом выполняется возведение в степень на выбранной кривой:
, где операция + определена по следующему алгоритму:
Алгоритм сложения
Требуется сложить две точки и
:
Стоит заметить, что если в ходе алгоритма получается сингулярная кривая, выбор кривой необходимо повторить. Если в ходе алгоритма делитель не нашелся, алгоритм стоит запустить еще раз.
Нахождение всех делителей числа
-
Пусть заданы два массива: пустой массив для простых делителей и массив с составными делителями. На первом шаге, во втором массиве находится число
.
-
По всем числам из массива составных делителей пока он не пустой:
- Берем первое число;
- Проверяем на простоту (тест Миллера-Рабина): если число простое, заносим его в массив простых чисел, и удаляем первое число из массива составных чисел;
- Если не простое, проверяем на четность: если число четное, в список простых делителей заносим
2, в список составных -
в конец;
- Если не четное, аналогично проверяем делимость на 3;
- В противном случае используем алгоритм Ленстры для поиска делителя, пока он не будет найден.
Когда делитель найден, добавляем его и
в список составных делителей в конец.
-
Результатом алгоритма будут все числа из списка простых делителей.
Скорость работы
Время работы данного алгоритма зависит не от самого факторизуемого числа, а то размера наименьшего делителя.
Время работы:
Release files for pyecf 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pyecf-0.1.3.tar.gz | 11.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyecf-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.7 kB
Release files / pyecf-0.1.3.tar.gz
| Download URL | pyecf-0.1.3.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0d071ce0f620865afc2196e298babf5fdad6bc1430bb3ced98d7cfa64165830d
|
|
BLAKE2b-256 checksum How to use checksums |
7db02f58783fe7c003ad89da5d6b5c8e435db1102e903b062fc7b0c76b5cc1ae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.6.1 CPython/3.9.6 Darwin/23.1.0
|
Release files / pyecf-0.1.3-py3-none-any.whl
| Download URL | pyecf-0.1.3-py3-none-any.whl |
|---|---|
| Size | 12.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8da617be507d334d2e10b1822a421c5358043ab14b5da65bbe752a3068eeed6e
|
|
BLAKE2b-256 checksum How to use checksums |
5853be98c1faf9d77d24bfb464f8620360de73151ccc58c7e75d587f6d8de8d7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.6.1 CPython/3.9.6 Darwin/23.1.0
|