У вас есть два больших целых числа 123456789 и 987654321. Какой метод (евклидовый алгоритм, разложение на простые множители или другой) вы выберете для нахождения НОД и НОК, почему именно он оптимален и какова его числовая сложность
Метод: евклидов алгоритм. Причина: он работает на целых без факторизации, даёт НОД быстро, а НОК находят по формуле lcm(a,b)=∣ab∣gcd(a,b)\operatorname{lcm}(a,b)=\dfrac{|a b|}{\gcd(a,b)}lcm(a,b)=gcd(a,b)∣ab∣. Короткое численное решение: - 987654321=8⋅123456789+9987654321=8\cdot 123456789+9987654321=8⋅123456789+9, значит gcd(123456789,987654321)=gcd(123456789,9)=9\gcd(123456789,987654321)=\gcd(123456789,9)=9gcd(123456789,987654321)=gcd(123456789,9)=9. - gcd(123456789,987654321)=9\gcd(123456789,987654321)=9gcd(123456789,987654321)=9. - lcm(123456789,987654321)=123456789⋅9876543219=1219326311126352699=13548070123626141\operatorname{lcm}(123456789,987654321)=\dfrac{123456789\cdot 987654321}{9}=\dfrac{121932631112635269}{9}=13548070123626141lcm(123456789,987654321)=9123456789⋅987654321=9121932631112635269=13548070123626141. Почему оптимален и сложность: - Евклидов алгоритм требует O(logmin(a,b))O(\log\min(a,b))O(logmin(a,b)) шагов деления (количество итераций линейно по числу разрядов в двоичном представлении — точнее O(n)O(n)O(n) итераций где nnn — число бит, но обычно оценивают как O(logmin(a,b))O(\log\min(a,b))O(logmin(a,b))). - Битовая сложность зависит от стоимости деления/умножения: при школьном умножении/делении M(n)=O(n2)M(n)=O(n^2)M(n)=O(n2) (где nnn — число бит) общая сложность O(n2logn)\;O(n^2\log n)O(n2logn). С быстрыми алгоритмами умножения получается O(M(n)logn)\;O(M(n)\log n)O(M(n)logn). - Факторизация чисел вообще сложнее (экспоненциально в наихудшем случае при текущих классических алгоритмах), поэтому для НОД/НОК евклидовый алгоритм практически оптимален.
Короткое численное решение:
- 987654321=8⋅123456789+9987654321=8\cdot 123456789+9987654321=8⋅123456789+9, значит gcd(123456789,987654321)=gcd(123456789,9)=9\gcd(123456789,987654321)=\gcd(123456789,9)=9gcd(123456789,987654321)=gcd(123456789,9)=9.
- gcd(123456789,987654321)=9\gcd(123456789,987654321)=9gcd(123456789,987654321)=9.
- lcm(123456789,987654321)=123456789⋅9876543219=1219326311126352699=13548070123626141\operatorname{lcm}(123456789,987654321)=\dfrac{123456789\cdot 987654321}{9}=\dfrac{121932631112635269}{9}=13548070123626141lcm(123456789,987654321)=9123456789⋅987654321 =9121932631112635269 =13548070123626141.
Почему оптимален и сложность:
- Евклидов алгоритм требует O(logmin(a,b))O(\log\min(a,b))O(logmin(a,b)) шагов деления (количество итераций линейно по числу разрядов в двоичном представлении — точнее O(n)O(n)O(n) итераций где nnn — число бит, но обычно оценивают как O(logmin(a,b))O(\log\min(a,b))O(logmin(a,b))).
- Битовая сложность зависит от стоимости деления/умножения: при школьном умножении/делении M(n)=O(n2)M(n)=O(n^2)M(n)=O(n2) (где nnn — число бит) общая сложность O(n2logn)\;O(n^2\log n)O(n2logn). С быстрыми алгоритмами умножения получается O(M(n)logn)\;O(M(n)\log n)O(M(n)logn).
- Факторизация чисел вообще сложнее (экспоненциально в наихудшем случае при текущих классических алгоритмах), поэтому для НОД/НОК евклидовый алгоритм практически оптимален.