git clone https://github.com/ochaplashkin/computer_algebra
python3.7 -m pip install -r requierments.txt
cd <lection_folder>
python3.7 main.py [requiered arguments]
- Алгоритмы нахождения НОД(а,b) в кольце Z(целые, положительные, не содержит 0):
- Алгоритм 6. Обобщённый алгоритм Евклида для полиномов над целыми числами (не реализован)
- Алгоритм 7. Китайская теорема об остатках
Из большего числа вычитаем меньшее. Если получается 0, то значит, что числа равны друг другу и являются наибольшим общим делителем (следует выйти из цикла). Если результат вычитания не равен 0, то большее число заменяем на результат вычитания.
cd ./lection_1
python3.7 main.py -k classic -a <первое_число> -b <второе_число>
Флаг -k=classic указывает на выбор классического алгоритма
В паре чисел одно число делится с остатком на второе; делитель и полученный остаток формируют новую пару. Действие повторяется, пока один из элементов пары не обратится в 0, тогда значение другого будет равно искомому наибольшему общему делителю.
cd ./lection_1
python3.7 main.py -k euclidean -a <первое_число> -b <второе_число>
Флаг -k=euclidean указывает на выбор алгоритма Евклида
Основан на использовании следующих свойств НОД: НОД(2m, 2n) = 2НОД(m, n), НОД(2m, 2n+1) = НОД(m, 2n+1), НОД(-m, n) = НОД(m, n).
Описание алгоритма:
- НОД(0, n) = n; НОД(m, 0) = m; НОД(m, m) = m;
- НОД(1, n) = 1; НОД(m, 1) = 1;
- Если m, n чётные, то НОД(m, n) = 2*НОД(m/2, n/2);
- Если m чётное, n нечётное, то НОД(m, n) = НОД(m/2, n);
- Если n чётное, m нечётное, то НОД(m, n) = НОД(m, n/2);
- Если m, n нечётные и n > m, то НОД(m, n) = НОД((n-m)/2, m);
- Если m, n нечётные и n < m, то НОД(m, n) = НОД((m-n)/2, n);
cd ./lection_1
python3.7 main.py -k binary -a <первое_число> -b <второе_число>
Флаг -k=binary указывает на выбор Бинарного алгоритма
НОД можно найти из разложения чисел на простые множители.
a = m1 * m2 * m3 * ... * mN где m – простые числа
НОД будет равен произведению простых множителей, общих для обоих чисел.
Например:
24 = (2) * 2 * 2 * (3) 54 = (2) * (3) * 3 * 3
Общие множители выделены скобками
НОД(24, 54) = 2 * 3 = 6
cd ./lection_1
python3.7 main.py -k prime -a <первое_число> -b <второе_число>
Флаг -k=prime указывает на выбор алгоритма с помощью разложения числа на простые множители
Пусть d - наибольший общий делитель чисел a и b. Тогда выражение ax+by всегда кратно d. Оказывается, что можно подобрать такие числа x и y, что ax+by=d.
cd ./lection_1
python3.7 main.py -k exteuclidean -a <первое_число> -b <второе_число>
Флаг -k=exteuclidean указывает на выбор расширенного алгоритма Евклида
Если натуральный числа (a1,a2,..,aN) попарно взаимно простые, то для любых целых (r1,r2,..rN) таких, что 0 <= ri < ai при всех i={1,n}, найдется число N, которое при делении на ai дает остаток ri при всех i={1,2,..,n}. Более того, если найдутся два таких числа N1 и N2, то N1 (сравнимо с) N2 по модулю M=(a1 * a2 * a3 ... * aN)
cd ./lection_3
python3.7 main.py -in <путь_до_входного_файла> [-f <отображать полный ответ?>]
Организация входного файла YAML формата пример:
r:
- значение 1
- значение 2
- ...
m:
- значение 1
- значение 2
- ...
Флаг -f= yes / no - позволяет включить / выключить вывод полного ответа решения на экран в виде <ответ> = <остаток> (mod )