Бинарный алгоритм вычисления НОД
Бинарный алгоритм Евклида — метод нахождения наибольшего общего делителя двух целых чисел. Данный алгоритм "быстрее" обычного алгоритма Евклида, т.к. вместо медленных операций деления и умножения используются сдвиги[1]. Возможно, алгоритм был известен еще в Китае 1-го века[2], но опубликован был лишь в 1967 году израильским физиком и программистом Джозефом Стайном. Он основан на использовании следующих свойств НОД:
- НОД(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);
Так как алгоритм является хвостовой рекурсией, то рекурсию можно заменить итерацией.
Существует также бинарная версия обобщенного алгоритма Евклида, описанная в книге Д. Кнута[3], а также в книге Василенко О.Н. "Теоретико-числовые методы в криптографии", с. 300.
Примечания
- Brent, Richard P., Twenty years' analysis of the Binary Euclidean Algorithm, Millenial Perspectives in Computer Science: Proceedings of the 1999 Oxford-Microsoft Symposium in honour of Professor Sir Antony Hoare (Palgrave, NY): 41–53, <http://wwwmaths.anu.edu.au/~brent/pub/pub183.html> proceedings edited by J. Davies, A. W. Roscoe and J. Woodcock.
- Knuth, Donald (1998), Seminumerical Algorithms, vol. 2 (3rd ed.), The Art of Computer Programming, Addison-Wesley, ISBN 0-201-89684-2
- Дональд Кнут "Искусство программирования" п. 4.5.2 задача 39
См. также
Литература
- Виноградов И. М. Основы теории чисел. М.-Л.: Гос. изд. технико-теоретической литературы, 1952, 180 с.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.