Одна з проблем методу Ньютона полягає в тому, що він вимагає операції ділення в кожній ітерації, яка є найповільнішою базовою цілочисельною операцією.
Однак метод Ньютона для зворотного квадратного кореня не відповідає. Якщоx - це номер, який ви хочете знайти 1x√, повторіть:
ri+1=12ri(3−xr2i)
Це часто виражається як:
wi=r2i
di=1−wix
ri+1=ri+ridi2
Це три операції множення. Поділ на два може бути реалізований як зсув-направо.
Зараз проблема полягає в тому rне є цілим числом. Однак ви можете маніпулювати нею, застосовуючи плаваючу крапку вручну і виконуючи купу операцій зсуву, щоб компенсувати, коли це доречно.
Спочатку давайте розширювати масштаб x:
x′=2−2ex
куди б ми хотіли x′ бути більшим за, але близьким до, 1. Якщо ми запустимо вищевказаний алгоритмx′ замість x, ми знайшли r=1x√′. Тоді,x−−√=2erx′.
Тепер давайте розділимо r в мантісу і показник:
ri=2−eir′i
де r′i- ціле число. Інтуїтивно,ei представляють точність відповіді.
Ми знаємо, що метод Ньютона приблизно подвоює кількість точних значущих цифр. Тож ми можемо вибрати:
ei+1=2ei
Трохи маніпулюючи, ми знаходимо:
ei+1=2ei
wi=r′i2
x′i=x22e−ei+1
di=2ei+1−w′ix′i2ei+1
r′i+1=2eir′i−r′idi2ei+1
На кожній ітерації:
x−−√≈r′ix2e+ei
Як приклад, спробуємо обчислити квадратний корінь x=263. Ми випадково знаємо, що відповідь є2312–√. Зворотний квадратний корінь є12√2−31, тому ми встановимо e=31 (це масштаб проблеми) і для нашої початкової здогадки ми виберемо r′0=3 і e0=2. (Тобто ми обираємо34 для нашої початкової оцінки до 12√.)
Тоді:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Ми можемо визначити, коли зупинити ітерацію, порівнюючи ei до e; якщо я правильно розрахував,ei>2eмає бути досить хорошим. Ми зупинимося тут, і знайдемо:
263−−−√≈3037000481×263231+32=3037000481
Правильним цілим квадратним коренем є 3037000499, тож ми досить близько. Ми можемо зробити ще одну ітерацію або оптимізовану остаточну ітерацію, яка не подвоюєтьсяei. Деталі залишаються як вправа.
Щоб проаналізувати складність цього методу, зауважимо, що множимо два b-бітні цілі числа займає O(blogb)операції. Однак ми влаштували речі такr′i<2ei. Отже множення для обчисленняwi множить два ei-бітові числа для отримання a ei+1-бітове число, а інші два множення множать два ei+1-бітові числа для отримання a 2ei+1-бітове число.
У кожному випадку кількість операцій за ітерацію становить O(eilogei), і є O(loge)необхідні ітерації. Остаточне множення йде на порядокO(2elog2e)операції. Тож загальна складність єO(elog2e) операцій, яка є субквадратичною за кількістю бітів у x. Це тикає всі коробки.
Однак цей аналіз приховує важливий принцип, про який повинні пам’ятати усі, хто працює з великими цілими числами: оскільки множення є надлінійним за кількістю бітів, будь-які операції множення повинні виконуватися лише на цілих числах, що мають приблизно величину поточної точності (і , Можу додати, вам слід спробувати помножити числа, які мають аналогічний порядок). Використання цілих чисел, більших за це, є марною витратою зусиль. Постійні фактори мають значення, а для великих цілих чисел вони мають велике значення.
Як підсумкове спостереження, два з множень мають форму ab2c. Очевидно, що марно обчислювати всі бітиab тільки кинути cз них геть правою зміною. Реалізація розумного методу множення, який враховує це, також залишається вправою.