Цілочисельний квадратний корінь (isqrt) із невід’ємного цілого числа n — це невід’ємне ціле число m, яке є найбільшим цілим числом, меншим або рівним квадратному кореню з n ,
Наприклад,
Вступне зауваження
Нехай та є цілими невід’ємними числами.
Алгоритми, які обчислюють ([en]) працюють вічно на кожному вході який не є ідеальним квадратом.
Алгоритми, що обчислюють працюють не вічно. Проте вони можуть обчислювати з будь-якою бажаною точністю .
Можна обрати будь-яке і обчислити .
Наприклад (нехай ):
Порівняйте результати з
Виявляється, що множення входу алгоритму на дає точність десяткових цифр.
Щоб обчислити (повне) десяткове представлення , можна виконати нескінченну кількість разів, збільшуючи в 100 разів при кожному проході.
Припустимо, що в наступній програмі ( ) процедура вже визначена, і — заради аргументації — що всі змінні можуть містити цілі числа необмеженої величини.
Тоді надрукує повне десяткове представлення .
// Друкує sqrt(y) без зупинки void sqrtForever( unsigned int y ) { unsigned int result = isqrt( y ); printf( "%d.", result );// print result, followed by a decimal point while( true )// повторюється вічно ... { y = y * 100;// теоретичний приклад: переповнення ігнорується result = isqrt( y ); printf( "%d", result % 10 );// надрукувати останню цифру результата } }
Висновок полягає в тому, що алгоритми, які обчислюють isqrt(), обчислювально еквівалентні алгоритмам, які обчислюють sqrt().
Основні алгоритми
Алгоритм з використанням лінійного пошуку
Наступні програми мовою C є простими реалізаціями.
Лінійний пошук
За допомогою додавання
У наведеній вище програмі (лінійний пошук, за зростанням) можна замінити множення на додавання, використовуючи еквівалентність
- .
// Цілочислельний квадратний корінь // (лінійний пошук, за зростанням) використовуючи додавання unsigned int isqrt( unsigned int y ) { unsigned int L = 0; unsigned int a = 1; unsigned int d = 3; while( a <= y ) { a = a + d;// (a + 1)^2 d = d + 2; L = L + 1; } return L; }
За допомогою віднімання
Jarvis, (2006) опублікував метод отримання цілочисельного квадратного кореня з використанням виключно віднімання.
Розрахунок , де є невід’ємним цілим числом, є окремим випадком, який не потребує повного алгоритму. Досить наступної програми.
// Цілочислельний квадратний корінь (використовуючи віднімання) unsigned int isqrt( unsigned int y ) { unsigned int a = 5 * y; unsigned int b = 0; while( a >= b ) { a = a - b; b = b + 10; } return b / 10; }
Числовий приклад
Наприклад, якщо обчислити використовуючи метод «віднімання», отримуємо послідовність
Це обчислення займає 14 кроків ітерації, як і лінійний пошук (за зростанням, починаючи з ).
Алгоритм із використанням бінарного пошуку
Лінійний пошук послідовно перевіряє кожне значення, доки воно не досягне найменшого де .
Прискорення досягається за допомогою двійкового пошуку. Наступна програма мово C є реалізацією.
// Цілочисильний квадратний корінь (використовуючи бінарний пошук) unsigned int isqrt( unsigned int y ) { unsigned int L = 0; unsigned int M; unsigned int R = y + 1; while( L != R - 1 ) { M = (L + R) / 2; if( M * M <= y ) L = M; else R = M; } return L; }
Числовий приклад
Наприклад, якщо обчислити використовуючи двійковий пошук, можна отримати послідовність
Це обчислення займає 21 крок ітерації, тоді як лінійний пошук (за зростанням, починаючи з ) потрібно 1414 кроків.
Алгоритм з використанням методу Ньютона
Один спосіб розрахунку і полягає у використанні [en], який є окремим випадком методу Ньютона, щоб знайти розв’язок рівняння , за даною ітераційною формулою
Послідовність сходиться квадратично до коли .
Критерій зупинки
Можна довести це є найбільшим можливим числом, для якого критерій зупинки
забезпечує в наведеному вище алгоритмі.
У реалізаціях, які використовують числові формати, які не можуть точно представити всі раціональні числа (наприклад, з плаваючою комою), для захисту від помилок округлення слід використовувати константу зупинки, меншу за одиницю.
Область обчислень
Хоча для багатьох є ірраціональним, послідовність містить лише раціональні значення, коли є раціональним. Таким чином, за допомогою цього методу немає необхідності виходити з поля раціональних чисел для обчислення , факт, який має деякі теоретичні переваги.
Використання тільки цілочисельного ділення
Для обчислень для дуже великих цілих чисел n можна використовувати евклідове ділення для обох операцій ділення. Це має перевагу в тому, що для кожного проміжного значення використовуються лише цілі числа, що робить непотрібним представлення великих чисел з плаваючою комою. Це еквівалентно використанню ітераційної формули
Використовуючи той факт, що
можна показати, що буде досягнуто протягом скінченної кількості ітерацій.
У оригінальній версії дано для , і для . Отже, у цілочисельній версії є і поки остаточне рішення не буде досягнуто. Для остаточного рішення виконується і , тому критерій зупинки такий .
Однак, не обов’язково є нерухомою точкою наведеної вище ітераційної формули. Дійсно, можна показати, що є фіксованою точкою тоді і тільки тоді, коли не є ідеальним квадратом. Якщо є ідеальним квадратом, послідовність закінчується циклом з періодом два між і замість того, щоб сходитись.
Приклад реалізації на C
// Ціллочисельний квадратний корінь unsigned int int_sqrt ( unsigned int s ) { unsigned int x0 = s / 2;// Початкова оцінка // Уникнути переповнгення коли s є максимальним значенням, яке можна представити value // Перевірка if ( x0 != 0 ) { unsigned int x1 = ( x0 + s / x0 ) / 2;// Оновлення while ( x1 < x0 )// Це також перевірка цикла { x0 = x1; x1 = ( x0 + s / x0 ) / 2; } return x0; } else { return s; } }
Числовий приклад
Наприклад, якщо обчислити цілочисельний квадратний корінь з використовуючи наведений вище алгоритм, можна отримати послідовність
Загалом потрібно 13 кроків ітерації. Хоча метод Герона сходиться квадратично близько до розв’язку, на початку досягається менше ніж один біт точності на ітерацію. Це означає, що вибір початкової оцінки є критичним для продуктивності алгоритму.
Якщо доступне швидке обчислення для цілої частини двійкового логарифма або [en] (наприклад, std::bit_width
у ), краще починати з
- ,
що є найменшим ступенем двійки, більшим за . У прикладі цілочисельного квадратного кореня з , , , а результуюча послідовність дорівнює
- .
У цьому випадку потрібні лише 4 кроки ітерації.
Поцифровий алгоритм
Традиційний [en] для обчислення квадратного кореня заснований на роботі від старших розрядів до нижчих, і з кожною новою цифрою вибирається найбільша, яка все ще дасть квадрат . Якщо зупинитися після одиниці, обчисленим результатом буде цілочисельний квадратний корінь.
Використання побітових операцій
При роботі в за основою 2 вибір цифри спрощується до числа між 0 («маленький кандидат») і 1 («великий кандидат»), а маніпуляції з цифрами можна виразити в термінах операцій двійкового зсуву. З *
— це множення, <<
— зсув вліво, а >>
— логічний зсув вправо, рекурсивний алгоритм для знаходження цілочисельного квадратного кореня з будь-якого натурального числа виглядає так:
def integer_sqrt(n: int) -> int: assert n >= 0, "sqrt працює тільки для невід'ємних вхідних даних" if n < 2: return n # Рекрсивний виклик: small_cand = integer_sqrt(n >> 2) << 1 large_cand = small_cand + 1 if large_cand * large_cand > n: return small_cand else: return large_cand # еквівалентно: def integer_sqrt_iter(n: int) -> int: assert n >= 0, "sqrt працює тільки для невід'ємних вхідних даних" if n < 2: return n # Find the shift amount. See also [[find first set]], # shift = ceil(log2(n) * 0.5) * 2 = ceil(ffs(n) * 0.5) * 2 shift = 2 while (n >> shift) != 0: shift += 2 # Unroll the bit-setting loop. result = 0 while shift >= 0: result = result << 1 large_cand = ( result + 1 ) # Same as result ^ 1 (xor), because the last bit is always 0. if large_cand * large_cand <= n >> shift: result = large_cand shift -= 2 return result
Представлення традиційних ручних порозрядних алгоритмів включають різні оптимізації, яких немає в коді вище, зокрема трюк попереднього віднімання квадрата попередніх цифр, що робить непотрібним загальний крок множення. Див. для прикладу.
У мовах програмування
Деякі мови програмування мають явну операцію обчисленню цілочисельного квадратного кореня на додаток до загального випадку або можуть бути розширені бібліотеками для цієї мети.
(isqrt x)
: Common Lisp.math.isqrt(x)
: Python.
Див. також
- [en]
Примітки
- [en]
- It is no surprise that the repeated multiplication by is a feature in Jarvis, (2006)
- The fractional part of square roots of perfect squares is rendered as .
- see ''.
- The method was defined for the positive integers. Te program below computes as well
- Woo, 1985.
- LispWorks Ltd, 1996.
- Python Software Foundation, 2001.
Посилання
- Jarvis, Ashley Frazer (2006). Square roots by subtraction (PDF). Mathematical Spectrum. 37: 119—122.
- LispWorks Ltd (1996). CLHS: Function SQRT, ISQRT. www.lispworks.com.
- Minsky, Marvin (1967). 9. The Computable Real Numbers. Computation: Finite and Infinite Machines. Prentice-Hall. ISBN . OCLC 0131655639.
- Python Software Foundation (2001). Mathematical functions. Python Standard Library documentation (since version 3.8)
- Woo, C (June 1985). .
- A geometric view of the square root algorithm.
{{}}
: Обслуговування CS1: Сторінки з параметром url-status, але без параметра archive-url ()
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cilochiselnij kvadratnij korin isqrt iz nevid yemnogo cilogo chisla n ce nevid yemne cile chislo m yake ye najbilshim cilim chislom menshim abo rivnim kvadratnomu korenyu z n isqrt n n displaystyle mbox isqrt n lfloor sqrt n rfloor Napriklad isqrt 27 27 5 19615242270663 5 displaystyle mbox isqrt 27 lfloor sqrt 27 rfloor lfloor 5 19615242270663 rfloor 5 Vstupne zauvazhennyaNehaj y displaystyle y ta k displaystyle k ye cilimi nevid yemnimi chislami Algoritmi yaki obchislyuyut en y displaystyle sqrt y pracyuyut vichno na kozhnomu vhodi y displaystyle y yakij ne ye idealnim kvadratom Algoritmi sho obchislyuyut y displaystyle lfloor sqrt y rfloor pracyuyut ne vichno Prote voni mozhut obchislyuvati y displaystyle sqrt y z bud yakoyu bazhanoyu tochnistyu k displaystyle k Mozhna obrati bud yake k displaystyle k i obchisliti y 100 k displaystyle lfloor sqrt y times 100 k rfloor Napriklad nehaj y 2 displaystyle y 2 k 0 2 100 0 2 1 k 1 2 100 1 200 14 k 2 2 100 2 20000 141 k 3 2 100 3 2000000 1414 k 8 2 100 8 20000000000000000 141421356 displaystyle begin aligned amp k 0 lfloor sqrt 2 times 100 0 rfloor lfloor sqrt 2 rfloor 1 amp k 1 lfloor sqrt 2 times 100 1 rfloor lfloor sqrt 200 rfloor 14 amp k 2 lfloor sqrt 2 times 100 2 rfloor lfloor sqrt 20000 rfloor 141 amp k 3 lfloor sqrt 2 times 100 3 rfloor lfloor sqrt 2000000 rfloor 1414 amp amp k 8 lfloor sqrt 2 times 100 8 rfloor lfloor sqrt 20000000000000000 rfloor 141421356 amp end aligned Porivnyajte rezultati z 2 1 41421356237309504880168872420969807856967187537694 displaystyle sqrt 2 1 41421356237309504880168872420969807856967187537694 Viyavlyayetsya sho mnozhennya vhodu algoritmu na 100 k displaystyle 100 k daye tochnist k displaystyle k desyatkovih cifr Shob obchisliti povne desyatkove predstavlennya y displaystyle sqrt y mozhna vikonati isqrt y displaystyle mbox isqrt y neskinchennu kilkist raziv zbilshuyuchi y displaystyle y v 100 raziv pri kozhnomu prohodi Pripustimo sho v nastupnij programi sqrtForever displaystyle mbox sqrtForever procedura isqrt y displaystyle mbox isqrt y vzhe viznachena i zaradi argumentaciyi sho vsi zminni mozhut mistiti cili chisla neobmezhenoyi velichini Todi sqrtForever y displaystyle mbox sqrtForever y nadrukuye povne desyatkove predstavlennya y displaystyle sqrt y Drukuye sqrt y bez zupinki void sqrtForever unsigned int y unsigned int result isqrt y printf d result print result followed by a decimal point while true povtoryuyetsya vichno y y 100 teoretichnij priklad perepovnennya ignoruyetsya result isqrt y printf d result 10 nadrukuvati ostannyu cifru rezultata Visnovok polyagaye v tomu sho algoritmi yaki obchislyuyut isqrt obchislyuvalno ekvivalentni algoritmam yaki obchislyuyut sqrt Osnovni algoritmiAlgoritm z vikoristannyam linijnogo poshuku Nastupni programi movoyu C ye prostimi realizaciyami Linijnij poshuk Za dopomogoyu dodavannya U navedenij vishe programi linijnij poshuk za zrostannyam mozhna zaminiti mnozhennya na dodavannya vikoristovuyuchi ekvivalentnist L 1 2 L 2 2 L 1 L 2 1 i 1 L 2 displaystyle L 1 2 L 2 2L 1 L 2 1 sum i 1 L 2 Cilochislelnij kvadratnij korin linijnij poshuk za zrostannyam vikoristovuyuchi dodavannya unsigned int isqrt unsigned int y unsigned int L 0 unsigned int a 1 unsigned int d 3 while a lt y a a d a 1 2 d d 2 L L 1 return L Za dopomogoyu vidnimannya Jarvis 2006 opublikuvav metod otrimannya cilochiselnogo kvadratnogo korenya z vikoristannyam viklyuchno vidnimannya Rozrahunok isqrt y displaystyle mbox isqrt y de y displaystyle y ye nevid yemnim cilim chislom ye okremim vipadkom yakij ne potrebuye povnogo algoritmu Dosit nastupnoyi programi Cilochislelnij kvadratnij korin vikoristovuyuchi vidnimannya unsigned int isqrt unsigned int y unsigned int a 5 y unsigned int b 0 while a gt b a a b b b 10 return b 10 Chislovij priklad Napriklad yaksho obchisliti isqrt 200 displaystyle mbox isqrt 200 vikoristovuyuchi metod vidnimannya otrimuyemo a b displaystyle a b poslidovnist 1000 0 990 10 980 20 960 30 930 40 890 50 840 60 780 70 710 80 630 90 540 100 440 110 330 120 210 130 80 140 displaystyle begin aligned amp 1000 0 rightarrow 990 10 rightarrow 980 20 rightarrow 960 30 rightarrow 930 40 rightarrow 890 50 rightarrow 840 60 rightarrow 780 70 rightarrow 710 80 amp rightarrow 630 90 rightarrow 540 100 rightarrow 440 110 rightarrow 330 120 rightarrow 210 130 rightarrow 80 140 end aligned 140 10 14 200 displaystyle 140 10 14 lfloor sqrt 200 rfloor Ce obchislennya zajmaye 14 krokiv iteraciyi yak i linijnij poshuk za zrostannyam pochinayuchi z 0 displaystyle 0 Algoritm iz vikoristannyam binarnogo poshuku Linijnij poshuk poslidovno pereviryaye kozhne znachennya doki vono ne dosyagne najmenshogo x displaystyle x de x 2 gt y displaystyle x 2 gt y Priskorennya dosyagayetsya za dopomogoyu dvijkovogo poshuku Nastupna programa movo C ye realizaciyeyu Cilochisilnij kvadratnij korin vikoristovuyuchi binarnij poshuk unsigned int isqrt unsigned int y unsigned int L 0 unsigned int M unsigned int R y 1 while L R 1 M L R 2 if M M lt y L M else R M return L Chislovij priklad Napriklad yaksho obchisliti isqrt 2000000 displaystyle mbox isqrt 2000000 vikoristovuyuchi dvijkovij poshuk mozhna otrimati L R displaystyle L R poslidovnist 0 2000001 0 1000000 0 500000 0 250000 0 125000 0 62500 0 31250 0 15625 0 7812 0 3906 0 1953 976 1953 976 1464 1220 1464 1342 1464 1403 1464 1403 1433 1403 1418 1410 1418 1414 1418 1414 1416 1414 1415 displaystyle begin aligned amp 0 2000001 rightarrow 0 1000000 rightarrow 0 500000 rightarrow 0 250000 rightarrow 0 125000 rightarrow 0 62500 rightarrow 0 31250 rightarrow 0 15625 amp rightarrow 0 7812 rightarrow 0 3906 rightarrow 0 1953 rightarrow 976 1953 rightarrow 976 1464 rightarrow 1220 1464 rightarrow 1342 1464 rightarrow 1403 1464 amp rightarrow 1403 1433 rightarrow 1403 1418 rightarrow 1410 1418 rightarrow 1414 1418 rightarrow 1414 1416 rightarrow 1414 1415 end aligned Ce obchislennya zajmaye 21 krok iteraciyi todi yak linijnij poshuk za zrostannyam pochinayuchi z 0 displaystyle 0 potribno 1414 krokiv Algoritm z vikoristannyam metodu NyutonaOdin sposib rozrahunku n displaystyle sqrt n i isqrt n displaystyle mbox isqrt n polyagaye u vikoristanni en yakij ye okremim vipadkom metodu Nyutona shob znajti rozv yazok rivnyannya x 2 n 0 displaystyle x 2 n 0 za danoyu iteracijnoyu formuloyu x k 1 1 2 x k n x k k 0 x 0 gt 0 displaystyle x k 1 frac 1 2 left x k frac n x k right quad k geq 0 quad x 0 gt 0 Poslidovnist x k displaystyle x k shoditsya kvadratichno do n displaystyle sqrt n kolik displaystyle k to infty Kriterij zupinki Mozhna dovesti ce c 1 displaystyle c 1 ye najbilshim mozhlivim chislom dlya yakogo kriterij zupinki x k 1 x k lt c displaystyle x k 1 x k lt c zabezpechuye x k 1 n displaystyle lfloor x k 1 rfloor lfloor sqrt n rfloor v navedenomu vishe algoritmi U realizaciyah yaki vikoristovuyut chislovi formati yaki ne mozhut tochno predstaviti vsi racionalni chisla napriklad z plavayuchoyu komoyu dlya zahistu vid pomilok okruglennya slid vikoristovuvati konstantu zupinki menshu za odinicyu Oblast obchislen Hocha n displaystyle sqrt n dlya bagatoh n displaystyle n ye irracionalnim poslidovnist x k displaystyle x k mistit lishe racionalni znachennya koli x 0 displaystyle x 0 ye racionalnim Takim chinom za dopomogoyu cogo metodu nemaye neobhidnosti vihoditi z polya racionalnih chisel dlya obchislennya isqrt n displaystyle mbox isqrt n fakt yakij maye deyaki teoretichni perevagi Vikoristannya tilki cilochiselnogo dilennya Dlya obchislen n displaystyle lfloor sqrt n rfloor dlya duzhe velikih cilih chisel n mozhna vikoristovuvati evklidove dilennya dlya oboh operacij dilennya Ce maye perevagu v tomu sho dlya kozhnogo promizhnogo znachennya vikoristovuyutsya lishe cili chisla sho robit nepotribnim predstavlennya velikih chisel z plavayuchoyu komoyu Ce ekvivalentno vikoristannyu iteracijnoyi formuli x k 1 1 2 x k n x k k 0 x 0 gt 0 x 0 Z displaystyle x k 1 left lfloor frac 1 2 left x k left lfloor frac n x k right rfloor right right rfloor quad k geq 0 quad x 0 gt 0 quad x 0 in mathbb Z Vikoristovuyuchi toj fakt sho 1 2 x k n x k 1 2 x k n x k displaystyle left lfloor frac 1 2 left x k left lfloor frac n x k right rfloor right right rfloor left lfloor frac 1 2 left x k frac n x k right right rfloor mozhna pokazati sho bude dosyagnuto n displaystyle lfloor sqrt n rfloor protyagom skinchennoyi kilkosti iteracij U originalnij versiyi dano x k n displaystyle x k geq sqrt n dlya k 1 displaystyle k geq 1 i x k gt x k 1 displaystyle x k gt x k 1 dlya x k gt n displaystyle x k gt sqrt n Otzhe u cilochiselnij versiyi ye x k n displaystyle lfloor x k rfloor geq lfloor sqrt n rfloor i x k x k gt x k 1 x k 1 displaystyle x k geq lfloor x k rfloor gt x k 1 geq lfloor x k 1 rfloor poki ostatochne rishennya x s displaystyle x s ne bude dosyagnuto Dlya ostatochnogo rishennya x s displaystyle x s vikonuyetsya n x s n displaystyle lfloor sqrt n rfloor leq lfloor x s rfloor leq sqrt n i x s 1 x s displaystyle lfloor x s 1 rfloor geq lfloor x s rfloor tomu kriterij zupinki takij x k 1 x k displaystyle lfloor x k 1 rfloor geq lfloor x k rfloor Odnak n displaystyle lfloor sqrt n rfloor ne obov yazkovo ye neruhomoyu tochkoyu navedenoyi vishe iteracijnoyi formuli Dijsno mozhna pokazati sho n displaystyle lfloor sqrt n rfloor ye fiksovanoyu tochkoyu todi i tilki todi koli n 1 displaystyle n 1 ne ye idealnim kvadratom Yaksho n 1 displaystyle n 1 ye idealnim kvadratom poslidovnist zakinchuyetsya ciklom z periodom dva mizh n displaystyle lfloor sqrt n rfloor i n 1 displaystyle lfloor sqrt n rfloor 1 zamist togo shob shoditis Priklad realizaciyi na C Cillochiselnij kvadratnij korin unsigned int int sqrt unsigned int s unsigned int x0 s 2 Pochatkova ocinka Uniknuti perepovngennya koli s ye maksimalnim znachennyam yake mozhna predstaviti value Perevirka if x0 0 unsigned int x1 x0 s x0 2 Onovlennya while x1 lt x0 Ce takozh perevirka cikla x0 x1 x1 x0 s x0 2 return x0 else return s Chislovij priklad Napriklad yaksho obchisliti cilochiselnij kvadratnij korin z 2000000 displaystyle 2000000 vikoristovuyuchi navedenij vishe algoritm mozhna otrimati poslidovnist 1000000 500001 250002 125004 62509 31270 15666 7896 4074 2282 1579 1422 1414 1414 displaystyle begin aligned amp 1000000 rightarrow 500001 rightarrow 250002 rightarrow 125004 rightarrow 62509 rightarrow 31270 rightarrow 15666 rightarrow 7896 amp rightarrow 4074 rightarrow 2282 rightarrow 1579 rightarrow 1422 rightarrow 1414 rightarrow 1414 end aligned Zagalom potribno 13 krokiv iteraciyi Hocha metod Gerona shoditsya kvadratichno blizko do rozv yazku na pochatku dosyagayetsya menshe nizh odin bit tochnosti na iteraciyu Ce oznachaye sho vibir pochatkovoyi ocinki ye kritichnim dlya produktivnosti algoritmu Yaksho dostupne shvidke obchislennya dlya ciloyi chastini dvijkovogo logarifma abo en napriklad std bit width u C 20 krashe pochinati z x 0 2 log 2 n 2 1 displaystyle x 0 2 lfloor log 2 n 2 rfloor 1 sho ye najmenshim stupenem dvijki bilshim za n displaystyle sqrt n U prikladi cilochiselnogo kvadratnogo korenya z 2000000 displaystyle 2000000 log 2 n 20 displaystyle lfloor log 2 n rfloor 20 x 0 2 11 2048 displaystyle x 0 2 11 2048 a rezultuyucha poslidovnist dorivnyuye 2048 1512 1417 1414 1414 displaystyle 2048 rightarrow 1512 rightarrow 1417 rightarrow 1414 rightarrow 1414 U comu vipadku potribni lishe 4 kroki iteraciyi Pocifrovij algoritmTradicijnij en dlya obchislennya kvadratnogo korenya n displaystyle sqrt n zasnovanij na roboti vid starshih rozryadiv do nizhchih i z kozhnoyu novoyu cifroyu vibirayetsya najbilsha yaka vse she dast kvadrat n displaystyle leq n Yaksho zupinitisya pislya odinici obchislenim rezultatom bude cilochiselnij kvadratnij korin Vikoristannya pobitovih operacij Pri roboti v za osnovoyu 2 vibir cifri sproshuyetsya do chisla mizh 0 malenkij kandidat i 1 velikij kandidat a manipulyaciyi z ciframi mozhna viraziti v terminah operacij dvijkovogo zsuvu Z ce mnozhennya lt lt zsuv vlivo a gt gt logichnij zsuv vpravo rekursivnij algoritm dlya znahodzhennya cilochiselnogo kvadratnogo korenya z bud yakogo naturalnogo chisla viglyadaye tak def integer sqrt n int gt int assert n gt 0 sqrt pracyuye tilki dlya nevid yemnih vhidnih danih if n lt 2 return n Rekrsivnij viklik small cand integer sqrt n gt gt 2 lt lt 1 large cand small cand 1 if large cand large cand gt n return small cand else return large cand ekvivalentno def integer sqrt iter n int gt int assert n gt 0 sqrt pracyuye tilki dlya nevid yemnih vhidnih danih if n lt 2 return n Find the shift amount See also find first set shift ceil log2 n 0 5 2 ceil ffs n 0 5 2 shift 2 while n gt gt shift 0 shift 2 Unroll the bit setting loop result 0 while shift gt 0 result result lt lt 1 large cand result 1 Same as result 1 xor because the last bit is always 0 if large cand large cand lt n gt gt shift result large cand shift 2 return result Predstavlennya tradicijnih ruchnih porozryadnih algoritmiv vklyuchayut rizni optimizaciyi yakih nemaye v kodi vishe zokrema tryuk poperednogo vidnimannya kvadrata poperednih cifr sho robit nepotribnim zagalnij krok mnozhennya Div dlya prikladu U movah programuvannyaDeyaki movi programuvannya mayut yavnu operaciyu obchislennyu cilochiselnogo kvadratnogo korenya na dodatok do zagalnogo vipadku abo mozhut buti rozshireni bibliotekami dlya ciyeyi meti isqrt x Common Lisp math isqrt x Python Div takozh en Primitki en It is no surprise that the repeated multiplication by 100 displaystyle 100 is a feature in Jarvis 2006 The fractional part of square roots of perfect squares is rendered as 000 displaystyle 000 see The method was defined for the positive integers Te program below computes isqrt 0 0 displaystyle mbox isqrt 0 0 as well Woo 1985 LispWorks Ltd 1996 Python Software Foundation 2001 Posilannya Jarvis Ashley Frazer 2006 Square roots by subtraction PDF Mathematical Spectrum 37 119 122 LispWorks Ltd 1996 CLHS Function SQRT ISQRT www lispworks com Minsky Marvin 1967 9 The Computable Real Numbers Computation Finite and Infinite Machines Prentice Hall ISBN 0 13 165563 9 OCLC 0131655639 Python Software Foundation 2001 Mathematical functions Python Standard Library documentation since version 3 8 Woo C June 1985 A geometric view of the square root algorithm a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z parametrom url status ale bez parametra archive url posilannya