Interval arithmetic by Robert Elton Maas: Demonstration of using Newton's method with intervals of exact rational numbers to compute bounds on square root of an exact rational number, 2 in this case, then feeding those imprecise bounds into a second interval arithmetic Newton's method sqrt to yield bounds on fourth-root of 2. Note that I manually emulate lazy evaluation, whereby output of fourth-root-of-2 is driving the process, and only when Newton's method for sqrt(2) -> frrt(2) hangs do we go back and run one iteration of 2 -> sqrt(2) before resuming the sqrt(2) -> frrt(2) process. Typically, once this gets started, there are three iterations of the toplevel process for each time we go back to the sub-process: -1- Using interval based on previous bounds sqrt(2), which is lopsided with respect to frrt(2), getting only a little bit more accuracy for frrt(2); -2- Using that resultant interval, which is nicely centered on frrt(2), doubles the number of significant digits in a single iteration, as is expected for Newton's method applied to exact (non-interval) input. This exhausts the amount of information available in our current approximation of sqrt(2), hence: -3- Using that already-as-accurate-as-possible interval as a starting point, Newton's method doesn't yield any better bounds for frrt(2). Bottom line: For each single iteration of 2 -> sqrt(2), which does the abovementionned three iterations of sqrt(2) -> frrt(2), the number of digits of accuracy in both sqrt(2) and frrt(2) doubles. * (setq two 2) Warning: Declaring TWO special. 2 * (setq guess (interval-to-sqrt-firstguess+bounds two)) 5/3 * (setq sqrt2 (interval+guess-to-sqrt-bounds two guess)) (6/5 5/3) * (show-interval sqrt2) 1.2d0 1.6666666666666667d0 1.[2..7] NIL * (setq guess (interval-to-sqrt-firstguess+bounds sqrt2)) 6/5 * (setq frrt2 (interval+guess-to-sqrt-bounds sqrt2 guess)) Warning: Declaring FRRT2 special. (1 25/18) * (show-interval frrt2) 1.0d0 1.3888888888888888d0 1.[0..4] NIL * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.0d0 1.3888888888888888d0 1.[0..4] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.0046511627906978d0 1.3888888888888888d0 1.[0..4] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!----------] 0.9d0 1.3333333333333333d0 0.[9..E] Interval didn't shrink enough: Old: 1.[0..4] New: 0.[9..E] Refinement (i.e. shrinkage) factor = 0.8974359 ** RETURN to go on: (9/10 4/3) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.2d0 1.6666666666666667d0 1.[2..7] [-----------------------------!!!!!!-----------------------------------] 1.3953488372093024d0 1.4333333333333333d0 1.3[9..E] [------------------------------!!!!!-----------------------------------] 1.4d0 1.4285714285714286d0 1.4[0..3] (7/5 10/7) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 0.9d0 1.3333333333333333d0 0.[9..E] [-----------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!--------] 1.1166666666666667d0 1.279317697228145d0 1.1[1..I] [-----------------------------------!!!!!!!!!!!!!!!!!!!!!!-------------] 1.12d0 1.25d0 1.1[2..F] (28/25 5/4) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.12d0 1.25d0 1.1[2..F] [---------------------------------!!!!!!!!!!!!!!-----------------------] 1.1814345991561181d0 1.2055455093429777d0 1.1[8..B] [-------------------------!!!!!!!!!!!!!!!!!!!--------------------------] 1.1666666666666667d0 1.2d0 1.1[6..A] (7/6 6/5) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1666666666666667d0 1.2d0 1.1[6..A] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [----------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.1830985915492958d0 1.2d0 1.18[3..K] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.1666666666666667d0 1.2d0 1.1[6..A] Interval didn't shrink enough: Old: 1.1[6..A] New: 1.1[6..A] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (7/6 6/5) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.4d0 1.4285714285714286d0 1.4[0..3] [----------------------------------!-----------------------------------] 1.4141414141414141d0 1.4142857142857144d0 1.4141[4..J] [----------------------------------!-----------------------------------] 1.4141414141414141d0 1.4142857142857144d0 1.4141[4..J] (140/99 99/70) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1666666666666667d0 1.2d0 1.1[6..A] [-----------------------------------!!!!!!!!!!!!!!!!!!!!!!!!!----------] 1.1833333333333333d0 1.1951710261569417d0 1.18[3..G] [-------------------------------------------!!!!!!!!!------------------] 1.1875d0 1.1909774436090226d0 1.18[7..B] (19/16 792/665) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1875d0 1.1909774436090226d0 1.18[7..B] [--------------------------------!!!-----------------------------------] 1.1891148414639938d0 1.1892387218045113d0 1.1891[1..E] [---------------------------------!!!----------------------------------] 1.1891643709825528d0 1.1892857142857143d0 1.1891[6..J] (1295/1089 333/280) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1891643709825528d0 1.1892857142857143d0 1.1891[6..J] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!--------------------] 1.1891643709825528d0 1.1892498590116058d0 1.1891[6..F] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.1891643709825528d0 1.1892857142857143d0 1.1891[6..J] Interval didn't shrink enough: Old: 1.1891[6..J] New: 1.1891[6..J] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (1295/1089 333/280) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.4141414141414141d0 1.4142857142857144d0 1.4141[4..J] [----------------------------------!-----------------------------------] 1.4142135605326258d0 1.4142135642135643d0 1.41421356[0..5] [----------------------------------!-----------------------------------] 1.4142135605326258d0 1.4142135642135643d0 1.41421356[0..5] (27720/19601 19601/13860) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1891643709825528d0 1.1892857142857143d0 1.1891[6..J] [--------------!!!!!!!!!!!!!!!!!!!!!-----------------------------------] 1.189189186093948d0 1.1892250426341335d0 1.1891[8..D] [--------------!!!!!!!!!!!!!!!!!!!!!-----------------------------------] 1.1891891891891893d0 1.1892250426341335d0 1.1891[8..D] (44/37 725237/609840) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1891891891891893d0 1.1892250426341335d0 1.1891[8..D] [----------------------------------!-----------------------------------] 1.1892071125461368d0 1.1892071159116613d0 1.18920711[2..6] [----------------------------------!!----------------------------------] 1.1892071135949704d0 1.1892071166902582d0 1.18920711[3..7] (41794200/35144593 65016517/54672156) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1892071135949704d0 1.1892071166902582d0 1.18920711[3..7] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------] 1.1892071135949704d0 1.1892071164104718d0 1.18920711[3..7] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.1892071135949704d0 1.1892071166902582d0 1.18920711[3..7] Interval didn't shrink enough: Old: 1.18920711[3..7] New: 1.18920711[3..7] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (41794200/35144593 65016517/54672156) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.4142135605326258d0 1.4142135642135643d0 1.41421356[0..5] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.41421356237309504[7..A] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.41421356237309504[7..A] (1086679440/768398401 768398401/543339720) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1892071135949704d0 1.1892071166902582d0 1.18920711[3..7] [----------------------------!!!!!!!-----------------------------------] 1.1892071148628278d0 1.1892071151426142d0 1.189207114[8..C] [----------------------------!!!!!!!-----------------------------------] 1.1892071148628278d0 1.1892071151426142d0 1.189207114[8..C] (19723/16585 2548777496117/2143257859512) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.1892071148628278d0 1.1892071151426142d0 1.189207114[8..C] [----------------------------------!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..8] [----------------------------------!!----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..9] (595083091/500403238 192254523967211219/161666140020337260) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..9] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..8] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..9] Interval didn't shrink enough: Old: 1.18920711500272106[5..9] New: 1.18920711500272106[5..9] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (595083091/500403238 192254523967211219/161666140020337260) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.4142135623730951d0 1.4142135623730951d0 1.41421356237309504[7..A] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.414213562373095048801688724209698078[0..B] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.414213562373095048801688724209698078[0..B] (1670005488191150880/1180872205318713601 1180872205318713601/835002744095575440) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.18920711500272106[5..9] [--------------!!!!!!!!!!!!!!!!!!!!!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066[2..D] [------------------!!!!!!!!!!!!!---------------------------------------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066[4..A] (2274536277529549176893349600/1912649402139125892120383317 1619692117/1361993295) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.189207115002721066[4..A] [----------------------------------!!----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475915[0..A] [----------------------------------!!----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475914[9..I] (299498316123706112289466061790835440/251847060402948244751717109090306863 1270663741710149377716766509546084053/1068496585396936451410720445191516320) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475914[9..I] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!--------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475914[9..H] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475914[9..I] Interval didn't shrink enough: Old: 1.189207115002721066717499970560475914[9..I] New: 1.189207115002721066717499970560475914[9..I] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (299498316123706112289466061790835440/251847060402948244751717109090306863 1270663741710149377716766509546084053/1068496585396936451410720445191516320) * (setq sqrt2 (interval-newton-sqrt two sqrt2)) 1.4142135623730951d0 1.4142135623730951d0 1.414213562373095048801688724209698078[0..B] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.414213562373095048801688724209698078569671875376948073176679737990732478[3..6] [----------------------------------!-----------------------------------] 1.4142135623730951d0 1.4142135623730951d0 1.414213562373095048801688724209698078569671875376948073176679737990732478[3..6] (3944126127469278527968910146598237760/2788918330588564181308597538924774401 2788918330588564181308597538924774401/1972063063734639263984455073299118880) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475914[9..I] [--------------------------!!!!!!!!!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.1892071150027210667174999705604759152[4..F] [--------------------------!!!!!!!!!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.1892071150027210667174999705604759152[4..F] (1279632423908100378/1076038318106743253 3000982989783584766648703080035715273154122059853866453/25235158383463910840206 28887098319534366393801994936640) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.1892071150027210667174999705604759152[4..F] [----------------------------------!-----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.1892071150027210667174999705604759152929720924638174130190022247194666681[1..H ] [----------------------------------!!----------------------------------] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475915292972092463817413019002224719466668[1..4] (6927190033166918493802262940973184057900719395991019997445680205991285760/58250 49266671321711790234283065296581938907575618691020556942654301800551 102047146812920690074653712342908837225279420585866904907483771451727887/858110 79941854529184372734495921648466822925030403629960954911932604810) * (setq frrt2 (interval-newton-sqrt sqrt2 frrt2)) 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475915292972092463817413019002224719466668[1..4] ** WARNING: New interval not included within old interval, ** so I'll have to intersect the two to get a valid interval refinement. [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!------------------------------] 1.189207115002721d0 1.189207115002721d0 1.1892071150027210667174999705604759152929720924638174130190022247194666681[8..I ] [!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!] 1.189207115002721d0 1.189207115002721d0 1.189207115002721066717499970560475915292972092463817413019002224719466668[1..4] Interval didn't shrink enough: Old: 1.189207115002721066717499970560475915292972092463817413019002224719466668[ 1..4] New: 1.189207115002721066717499970560475915292972092463817413019002224719466668[ 1..4] Refinement (i.e. shrinkage) factor = 1.0 ** RETURN to go on: (6927190033166918493802262940973184057900719395991019997445680205991285760/58250 49266671321711790234283065296581938907575618691020556942654301800551 102047146812920690074653712342908837225279420585866904907483771451727887/858110 79941854529184372734495921648466822925030403629960954911932604810) * Would you like me to set up this software as a Web-server-side application so that you-all can play with it? Urgent note: I'm in desperate financial circumstances. I desperately need a source of income to avoid becoming homeless. Please refer me to somebody who has money to hire me for writing software.