2001 Digits Of Root Two
The square root of two is an irrational number that can be computed aproximately to any degree of precision.
This task involves computing the first 2001 digits of the decimal expansion.
J
First, we define a routine which finds the square root of a number as a decimal character string to a given precision (after the decimal place - and we'll give a default of 2000 characters after the decimal place to coincide with the requirements of this task):
<lang J>sqrt=:verb define
2000 sqrt y
approx=. x:%:y twok=. p=. x: (-y),0,1 f=. - p&p. % (p.. p)&p. whilst. -. twok -: prev do. prev=. twok approx=. f approx twok=. (j. x) ": approx end.
)</lang>
Then, we set our display precision with sufficient columns to display the result, and evaluate:
<lang J> 9!:37]0 4096 0 222
sqrt 2
1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008</lang>
Faster, though, would be to use integer arithmetic:
<lang J> (2*10x^2*2000)<.@^0.5 141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008 </lang>
Python
<lang python>root(a): if a<2:return a b=a//2 c=(a//b+b)//2 d=(a//c+c)//2 while b!=c and b!=d:b,c,d=c,d,(a//d+d)//2 if c<d:return c return d print(root(2*100**2000))</lang>
- Output:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008
REXX
This REXX version allows the user to specify the number of decimal digits and also the number to be taken the square root of.
Note that the sqrt function computes the square root of the number to 2,001 decimal digits + an additional six decimal digits,
and the result is rounded to 2,001 decimal digits.
<lang rexx>/*REXX program calculates & displays the square root (SQRT) of 2 to 2001 decimal places.*/
parse arg d n . /*obtain optional arguments from the CL*/
if d== | d=="," then d=2001 /*Not specified? Then use the default.*/
if n== | n=="," then n= 2 /* " " " " " " */
numeric digits d /*ensure enough decimal digits for SQRT*/
say 'the square root of ' n " computed to " d ' decimal digits is:'
say
say sqrt(n) /*display result with requested digits.*/
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
sqrt: procedure; parse arg x; if x=0 then return 0; d=digits(); m.=9; numeric form; h=d+6
numeric digits; parse value format(x,2,1,,0) 'E0' with g 'E' _ .; g=g *.5'e'_ % 2 do j=0 while h>9; m.j=h; h=h%2+1; end /*j*/ do k=j+5 to 0 by -1; numeric digits m.k; g=(g+x/g)*.5; end /*k*/ numeric digits d; return g/1</lang>
output when using the default inputs:
(the terminal screen was 200 bytes wide.)
the square root of 2 computed to 2001 decimal digits is: 1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571 47010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884 71603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801 62075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836 98683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884 72089694633862891562882765952635140542267653239694617511291602408715510135150455381287560052631468017127402653969470240300517495318862925631385188163478001569369176881852378684052287837629389214300655 86956868596459515550164472450983689603688732311438941557665104088391429233811320605243362948531704991577175622854974143899918802176243096520656421182731672625753959471725593463723863226148274262220867 11558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668 98329989895386728822856378697749662519966583525776198939322845344735694794962952168891485492538904755828834526096524096542889394538646625744927556381964410316979833061852019379384940057156333720548068 54057586799967012137223947582142630658513221740883238294728761739364746783743196000159218880734785761725221186749042497736692920731109636972160893370866115673458533483329525467585164471075784860246360 08
Ruby
<lang ruby>require "bigdecimal/math"
puts BigDecimal.new(2).sqrt(2001)</lang>
Scheme
<lang scheme>(define (root a)
(define (w a b c d) (if (or (= b c) (= b d)) (if (< c d) c d) (w a c d (quotient (+ d (quotient a d)) 2)))) (if (< a 2) a (let* ((b (quotient a 2)) (c (quotient (+ b (quotient a b)) 2)) (d (quotient (+ c (quotient a c)) 2))) (w a b c d))))
(display (root (* 2 (expt 100 2000))))</lang>
zkl
Uses GNU GMP library. <lang zkl>var [const] BN=Import("zklBigNum"); fcn sqrt(a){
if(a<2) return(a); b,c,d:=a/2, (a/b + b)/2, (a/c + c)/2; while(b!=c and b!=d){ b,c,d=c,d,(a/d + d)/2 } if(c<d) return(c); d
}</lang> <lang zkl>a:=BN(100).pow(2000)*2; (sa:=sqrt(a)) .println(); println("Does GMP agree: ",sa==a.root(2));</lang>
- Output:
141421356237309504880168872420969807856967187537694807317667973799 ... Does GMP agree: True