2001 Digits Of Root Two: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Highlight warning to make it more obvious) |
Thundergnat (talk | contribs) (Convert superceded task page to a redirect, remove content.) |
||
Line 1: | Line 1: | ||
#REDIRECT [[Integer_roots]] |
|||
{{Alertbox|pink|'''Do not add new implementations to this page. See [[Integer_roots]] instead. This page will be removed in the near future.'''}} |
|||
{{duplicate|Integer_roots}} |
|||
{{draft task|Arithmetic operations}} |
|||
'''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. |
|||
=={{header|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> |
|||
=={{header|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> |
|||
{{out}} |
|||
<pre>141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008</pre> |
|||
=={{header|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, |
|||
<br>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: |
|||
<br>(the terminal screen was 200 bytes wide.) |
|||
<pre> |
|||
the square root of 2 computed to 2001 decimal digits is: |
|||
1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571 |
|||
47010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884 |
|||
71603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801 |
|||
62075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836 |
|||
98683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884 |
|||
72089694633862891562882765952635140542267653239694617511291602408715510135150455381287560052631468017127402653969470240300517495318862925631385188163478001569369176881852378684052287837629389214300655 |
|||
86956868596459515550164472450983689603688732311438941557665104088391429233811320605243362948531704991577175622854974143899918802176243096520656421182731672625753959471725593463723863226148274262220867 |
|||
11558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668 |
|||
98329989895386728822856378697749662519966583525776198939322845344735694794962952168891485492538904755828834526096524096542889394538646625744927556381964410316979833061852019379384940057156333720548068 |
|||
54057586799967012137223947582142630658513221740883238294728761739364746783743196000159218880734785761725221186749042497736692920731109636972160893370866115673458533483329525467585164471075784860246360 |
|||
08 |
|||
</pre> |
|||
=={{header|Ruby}}== |
|||
<lang ruby>require "bigdecimal/math" |
|||
puts BigDecimal.new(2).sqrt(2001)</lang> |
|||
=={{header|Scheme}}== |
|||
{{trans|Python}} |
|||
<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> |
|||
=={{header|zkl}}== |
|||
{{trans|Python}} |
|||
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> |
|||
{{out}} |
|||
<pre> |
|||
141421356237309504880168872420969807856967187537694807317667973799 ... |
|||
Does GMP agree: True |
|||
</pre> |
Latest revision as of 23:52, 22 June 2016
Redirect to: