2001 Digits Of Root Two

Revision as of 23:48, 6 June 2016 by Thundergnat (talk | contribs) (Highlight warning to make it more obvious)
Do not add new implementations to this page. See Integer_roots instead. This page will be removed in the near future.
This page is a duplicate of Integer_roots. Its information should be merged with that of its sibling page. Please see the Talk page for details.


The square root of two is an irrational number that can be computed aproximately to any degree of precision.

2001 Digits Of Root Two is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.

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

Translation of: 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>

zkl

Translation of: 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>

Output:
141421356237309504880168872420969807856967187537694807317667973799 ...
Does GMP agree: True