33 lines
1.2 KiB
Text
33 lines
1.2 KiB
Text
{require lib_BN}
|
|
|
|
{def genpi
|
|
{def genpi.loop
|
|
{lambda {:n :pi :q :r :t :i :z}
|
|
{if {> :z :n}
|
|
then :pi
|
|
else {let { {:n :n} {:pi :pi} {:q :q} {:r :r} {:t :t} {:i :i} {:z :z}
|
|
{:digit {BN./ {BN.+ {BN.* {BN.- {BN.* :i 27} 12} :q}
|
|
{BN.* :r 5} }
|
|
{BN.* :t 5} } }
|
|
{:u {BN.* {BN.+ {BN.* :i 3} 1}
|
|
{BN.* 3 {BN.+ {BN.* :i 3} 2} } } }
|
|
} {genpi.loop :n
|
|
{BN.+ :pi :digit}
|
|
{BN.* {BN.* :q 1}
|
|
{BN.* :i {BN.- {BN.* :i 2} 1} }}
|
|
{BN.* {BN.* :u 1}
|
|
{BN.+ {BN.* :q {BN.- {BN.* :i 5} 2} }
|
|
{BN.- :r {BN.* :t :digit} }}}
|
|
{BN.* :t :u}
|
|
{BN.+ :i 1}
|
|
{+ :z 1}} }}}}
|
|
{lambda {:n}
|
|
{genpi.loop :n # 1 180 60 2 0} }}
|
|
-> genpi
|
|
|
|
We can generate π with 72 digits in about 500ms.
|
|
|
|
{BN.DEC 72}
|
|
-> 72 digits
|
|
{genpi 60}
|
|
-> 3.141592653589793238462643383279502884197169399375105820974944592307816406
|