Integer roots: Difference between revisions

From Rosetta Code
Content added Content deleted
Line 135: Line 135:
(display (root 2 (* 2 (expt 100 2000))))</lang>
(display (root 2 (* 2 (expt 100 2000))))</lang>


{{out}}
<pre>First 2,001 digits of the square root of two:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008</pre>


=={{header|zkl}}==
=={{header|zkl}}==

Revision as of 22:25, 11 May 2016

Integer roots 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.

Integer roots

The task is to write a program that computes an approximation to the principal Nth root of X as the largest integer less than or equal to R for which R^N=X. N is a positive integer. X is a non-negative integer. R is a non-negative real number.

Example: With N=3 and X=8 you would calculate the number 2 because .

Example: With N=3 and X=9 you would again calculate the number 2 because 2 is the largest integer less than or equal to the actual root R.


J

<.@%: satisfies this task. Left argument is the task's N, right argument is the task's X:

<lang J> 9!:37]0 4096 0 222 NB. set display truncation sufficiently high for our results

  2 <.@%: (2*10x^2*2000)

141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008

  3 <.@%: (2*10x^2*2000)

27144176165949065715180894696794892048051077694890969572843654428033085563287658494871973768515010449601702702662017016622108188038292129512829222732037939681464769491319263029308919709511736401200395299672806902057959507281705818417585572775465293620106435558459837272246448049135012971629241921717289904494332635356114519208640365765906522454723182775121756558058020787429240528065700321862315922465987881667832001482693220149093231249941256750252873117504822276540899360702266289427386749058832442643990936924594623694605667125995688788028079451303313515777223983018552490248388121970980055977541748894293734175182220013380497630428176870053423294103392285168797917553010332228664978678396929617114885278335650885524410898341213271192520021355449870508579216359067962061031950345530646092202370608763454397416764433915183368398263533906772869972563479248093751375796381425079119097628053496428734814910307755317031117606073779997125797512066497555354285360734633889394275558674944424368960732987910929093583629174893939036518727793282632439102479840614327136348027409016670160346303867705846755103908964945780837562103026771901489757443287280572195601219016859180373403783498753667545621963282035797597576337893795984255961467481252116653755272803423453851317757500585155874395469445425245653837328715044666730082806623655698726925

  5 <.@%: (2*10x^2*2000)

114869835499703500679862694677792758944385088909779750551371111849360320625351305681147311301150847391457571782825280872990018972855371267615994917020637676959403854539263226492033301322122190625130645468320078386350285806907949085127708283982797043969640382563667945344431106523789654147255972578315704103326302050272017414235255993151553782375173884359786924137881735354092890268530342009402133755822717151679559278360263800840317501093689917495888199116488588871447782240220513546797235647742625493141141704109917646404017146978939243424915943739448283626010758721504375406023613552985026793701507511351368254645700768390780390334017990233124030682358360249760098999315658413563173197024899154512108923313999675829872581317721346549115423634135836394159076400636688679216398175376716152621781331348

  7 <.@%: (2*10x^2*2000)

29619362959451736245702628695019269518064618216015009169507699742781423769947484925822512257735101524178182602734424986961003971858127002794053824818478879396020132662403256874761276690431037137165264232256601651438511207764019815767975124455844526943932927494896013055497926678521360177960529077012650088983239249505488961115547364229473827474458408002500739618874659540108997885564940730803150961523774615079827002013042942440654069714159530336055547627964891459096727426898214883744931710925020592035759639587602673656267343846153343265577563529779031634608306646526796</lang>


Python

<lang python>def root(a,b):

   if b<2:return b
   a1=a-1
   c=1
   d=(a1*c+b//(c**a1))//a
   e=(a1*d+b//(d**a1))//a
   while c!=d and c!=e:
       c,d,e=d,e,(a1*e+b//(e**a1))//a
   return min(d,e)

print("First 2,001 digits of the square root of two:\n{}".format(root(2,2*100**2000)))</lang>

Output:
First 2,001 digits of the square root of two:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008

REXX

No error checking is performed to ensure the root is a non-zero integer.
Negative and complex roots are supported. <lang rexx>/*REXX program calculates the Nth root of a number to a specified number of decimal digs*/ parse arg num root digs . /*obtain the optional arguments from CL*/ if num== | num=="," then num= 2 /*Not specified? Then use the default.*/ if root== | root=="," then root= 2 /* " " " " " " */ if digs== | digs=="," then digs=2001 /* " " " " " " */ numeric digits digs /*utilize this number of decimal digits*/ say 'number=' num /*display the number that will be used.*/ say ' root=' root /* " " root " " " " */ say 'digits=' digs /* " dec. digits " " " " */ say /* " a blank line. */ say 'result:'; say iRoot(num, root) /* " what it is; display the root.*/ exit /*stick a fork in it, we're all done. */ /*──────────────────────────────────────────────────────────────────────────────────────*/ iRoot: procedure; parse arg x 1 ox, y 1 oy /*obtain the numbers, Y is the root #.*/ i=; x=abs(x); y=abs(y) /*use the absolute values of X and Y. */ if ox<0 & oy//2==0 then do; i='i'; ox=x; end /*if the results will be imaginary ··· */ od=digits() /*the current number of decimal digits.*/ a=od+9 /*bump the decimal digits by nine. */ numeric form /*number will be in exponential form.*/ parse value format(x,2,1,,0) 'E0' with ? 'E' _ . /*obtain exponent so we can do division*/ g=(?/y'E'_ % y) + (x>1) /*this is a best first guess of a root.*/ m=y-1 /*define a (fast) variable for later. */ d=5 /*start with only five decimal digits. */

            do  until d==a                      /*keep computing 'til we're at max digs*/
            d=min(d+d,a);           dm=d-2      /*bump number of (growing) decimal digs*/
            numeric digits d                    /*increase the number of decimal digits*/
            o=0                                 /*set the old value to zero (1st time).*/
                do  until o=g;      o=g         /*keep computing as long as  G changes.*/
                g=format((m*g**y+x)/y/g**m,,dm) /*compute the  Yth  root of  X.        */
                end   /*until o=g*/
            end       /*until d==a*/

_=g*sign(ox) /*change the sign of the result, maybe.*/ numeric digits od /*set numeric digits to the original.*/ if oy<0 then return (1/_)i /*Is the root negative? Use reciprocal*/

             return (_/1)i                      /*return the  Yth root of X to invoker.*/</lang>

output   when the defaults are being used:

number= 2
  root= 2
digits= 2001

result:
1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641572735013846230912297024924836055850737212644121497099935831413222665927505592755799950501152782060571
47010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884
71603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801
62075847492265722600208558446652145839889394437092659180031138824646815708263010059485870400318648034219489727829064104507263688131373985525611732204024509122770022694112757362728049573810896750401836
98683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884
72089694633862891562882765952635140542267653239694617511291602408715510135150455381287560052631468017127402653969470240300517495318862925631385188163478001569369176881852378684052287837629389214300655
86956868596459515550164472450983689603688732311438941557665104088391429233811320605243362948531704991577175622854974143899918802176243096520656421182731672625753959471725593463723863226148274262220867
11558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668
98329989895386728822856378697749662519966583525776198939322845344735694794962952168891485492538904755828834526096524096542889394538646625744927556381964410316979833061852019379384940057156333720548068
54057586799967012137223947582142630658513221740883238294728761739364746783743196000159218880734785761725221186749042497736692920731109636972160893370866115673458533483329525467585164471075784860246360
08

output   when using the input of:   -81

number= -81
  root= 2
digits= 2001

result:
9i

output   when using the input of:   4   -2

number= 4
  root= -2
digits= 2001

result:
0.5

Scheme

Translation of: Python

<lang scheme>(define (root a b)

 (define (y a a1 b c d e)
   (if (or (= c d) (= c e))
     (if (< d e) d e)
     (y a a1 b d e (quotient (+ (* a1 e) (quotient b (expt e a1))) a))))
 (if (< b 2)
   b
   (let* ((a1 (- a 1))
          (c 1)
          (d (quotient (+ (* a1 c) (quotient b (expt c a1))) a))
          (e (quotient (+ (* a1 d) (quotient b (expt d a1))) a)))
     (y a a1 b c d e))))
     

(display "First 2,001 digits of the square root of two:\n") (display (root 2 (* 2 (expt 100 2000))))</lang>

Output:
First 2,001 digits of the square root of two:
141421356237309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702492483605585073721264412149709993583141322266592750559275579995050115278206057147010955997160597027453459686201472851741864088919860955232923048430871432145083976260362799525140798968725339654633180882964062061525835239505474575028775996172983557522033753185701135437460340849884716038689997069900481503054402779031645424782306849293691862158057846311159666871301301561856898723723528850926486124949771542183342042856860601468247207714358548741556570696776537202264854470158588016207584749226572260020855844665214583988939443709265918003113882464681570826301005948587040031864803421948972782906410450726368813137398552561173220402450912277002269411275736272804957381089675040183698683684507257993647290607629969413804756548237289971803268024744206292691248590521810044598421505911202494413417285314781058036033710773091828693147101711116839165817268894197587165821521282295184884720896946338628915628827659526351405422676532396946175112916024087155101351504553812875600526314680171274026539694702403005174953188629256313851881634780015693691768818523786840522878376293892143006558695686859645951555016447245098368960368873231143894155766510408839142923381132060524336294853170499157717562285497414389991880217624309652065642118273167262575395947172559346372386322614827426222086711558395999265211762526989175409881593486400834570851814722318142040704265090565323333984364578657967965192672923998753666172159825788602633636178274959942194037777536814262177387991945513972312740668983299898953867288228563786977496625199665835257761989393228453447356947949629521688914854925389047558288345260965240965428893945386466257449275563819644103169798330618520193793849400571563337205480685405758679996701213722394758214263065851322174088323829472876173936474678374319600015921888073478576172522118674904249773669292073110963697216089337086611567345853348332952546758516447107578486024636008

zkl

Translation of: Python

Uses GNU GMP library <lang zkl>var [const] BN=Import("zklBigNum"); fcn root(n,r){

  f:='wrap(z){ (n/z.pow(r-1) + z*(r-1))/r or 1 };  //--> v or 1
  c,d,e:=1,f(c),f(d);
  while(c!=d and c!=e){ c,d,e=d,e,f(e) }
  if(d<e) d else e

}</lang> <lang zkl>a:=BN(100).pow(2000)*2; println("Does GMP agree: ",root(a,3)==a.root(3));</lang>

Output:
Does GMP agree: True