September 2017 Update

This commit is contained in:
Ingy döt Net 2017-09-23 10:01:46 +02:00
parent bba7bfd280
commit ba8067c3b7
14570 changed files with 153136 additions and 63871 deletions

30
Task/Pi/Bc/pi.bc Normal file
View file

@ -0,0 +1,30 @@
#!/usr/bin/bc -l
scaleinc= 20
define zeropad ( n ) {
auto m
for ( m= scaleinc - 1; m > 0; --m ) {
if ( n < 10^m ) {
print "0"
}
}
return ( n )
}
wantscale= scaleinc - 2
scale= wantscale + 2
oldpi= 4*a(1)
scale= wantscale
oldpi= oldpi / 1
oldpi
while( 1 ) {
wantscale= wantscale + scaleinc
scale= wantscale + 2
pi= 4*a(1)
scale= 0
digits= ((pi - oldpi) * 10^wantscale) / 1
zeropad( digits )
scale= wantscale
oldpi= pi / 1
}

View file

@ -1,41 +0,0 @@
#include "gmp.h"
void agm (const mpf_t in1, const mpf_t in2, mpf_t out1, mpf_t out2) {
mpf_add (out1, in1, in2);
mpf_div_ui (out1, out1, 2);
mpf_mul (out2, in1, in2);
mpf_sqrt (out2, out2);
}
int main (void) {
mpf_set_default_prec (300000);
mpf_t x0, y0, resA, resB, Z, var;
mpf_init_set_ui (x0, 1);
mpf_init_set_d (y0, 0.5);
mpf_sqrt (y0, y0);
mpf_init (resA);
mpf_init (resB);
mpf_init_set_d (Z, 0.25);
mpf_init (var);
int n = 1;
for(int i=0; i<8; i++){
agm(x0, y0, resA, resB);
mpf_sub(var, resA, x0);
mpf_mul(var, var, var);
mpf_mul_ui(var, var, n);
mpf_sub(Z, Z, var);
n += n;
agm(resA, resB, x0, y0);
mpf_sub(var, x0, resA);
mpf_mul(var, var, var);
mpf_mul_ui(var, var, n);
mpf_sub(Z, Z, var);
n += n;
}
mpf_mul(x0, x0, x0);
mpf_div(x0, x0, Z);
gmp_printf ("%.100000Ff\n", x0);
return 0;
}

View file

@ -0,0 +1,30 @@
require "big_int"
def pi
q, r, t, k, n, l = [1, 0, 1, 1, 3, 3].map { |n| BigInt.new(n) }
dot_written = false
loop do
if 4*q + r - t < n*t
yield n
unless dot_written
yield '.'
dot_written = true
end
nr = 10*(r - n*t)
n = ((10*(3*q + r)) / t) - 10*n
q *= 10
r = nr
else
nr = (2*q + r) * l
nn = (q*(7*k + 2) + r*l) / (t*l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
end
end
end
pi { |digit_or_dot| print digit_or_dot; STDOUT.flush }

View file

@ -1,5 +1,19 @@
pi_ = g(1,0,1,1,3,3) where
g (q,r,t,k,n,l) =
if 4*q+r-t < n*t
then n : g (10*q, 10*(r-n*t), t, k, div (10*(3*q+r)) t - 10*n, l)
else g (q*k, (2*q+r)*l, t*l, k+1, div (q*(7*k+2)+r*l) (t*l), l+2)
pi_ = g (1, 0, 1, 1, 3, 3)
where
g (q, r, t, k, n, l) =
if 4 * q + r - t < n * t
then n :
g
( 10 * q
, 10 * (r - n * t)
, t
, k
, div (10 * (3 * q + r)) t - 10 * n
, l)
else g
( q * k
, (2 * q + r) * l
, t * l
, k + 1
, div (q * (7 * k + 2) + r * l) (t * l)
, l + 2)

View file

@ -1,10 +1,10 @@
prec = get_bigfloat_precision()
prec = precision(BigFloat)
spi = ""
digit = 1
while true
if digit > length(spi) - 6
prec *= 2
set_bigfloat_precision(prec)
setprecision(prec)
spi = string(big(π))
end
print(spi[digit])

45
Task/Pi/Kotlin/pi.kotlin Normal file
View file

@ -0,0 +1,45 @@
// version 1.1.2
import java.math.BigInteger
val ZERO = BigInteger.ZERO
val ONE = BigInteger.ONE
val TWO = BigInteger.valueOf(2L)
val THREE = BigInteger.valueOf(3L)
val FOUR = BigInteger.valueOf(4L)
val SEVEN = BigInteger.valueOf(7L)
val TEN = BigInteger.TEN
fun calcPi() {
var nn: BigInteger
var nr: BigInteger
var q = ONE
var r = ZERO
var t = ONE
var k = ONE
var n = THREE
var l = THREE
var first = true
while (true) {
if (FOUR * q + r - t < n * t) {
print(n)
if (first) { print ("."); first = false }
nr = TEN * (r - n * t)
n = TEN * (THREE * q + r) / t - TEN * n
q *= TEN
r = nr
}
else {
nr = (TWO * q + r) * l
nn = (q * SEVEN * k + TWO + r * l) / (t * l)
q *= k
t *= l
l += TWO
k += ONE
n = nn
r = nr
}
}
}
fun main(args: Array<String>) = calcPi()

View file

@ -0,0 +1,57 @@
Function Get-Pi ( $Digits )
{
$Big = [bigint[]](0..10)
$ndigits = 0
$Output = ""
$q = $t = $k = $Big[1]
$r = $Big[0]
$l = $n = $Big[3]
# Calculate first digit
$nr = ( $Big[2] * $q + $r ) * $l
$nn = ( $q * ( $Big[7] * $k + $Big[2] ) + $r * $l ) / ( $t * $l )
$q *= $k
$t *= $l
$l += $Big[2]
$k = $k + $Big[1]
$n = $nn
$r = $nr
$Output += [string]$n + '.'
$ndigits++
$nr = $Big[10] * ( $r - $n * $t )
$n = ( ( $Big[10] * ( 3 * $q + $r ) ) / $t ) - 10 * $n
$q *= $Big[10]
$r = $nr
While ( $ndigits -lt $Digits )
{
While ( $ndigits % 100 -ne 0 -or -not $Output )
{
If ( $Big[4] * $q + $r - $t -lt $n * $t )
{
$Output += [string]$n
$ndigits++
$nr = $Big[10] * ( $r - $n * $t )
$n = ( ( $Big[10] * ( 3 * $q + $r ) ) / $t ) - 10 * $n
$q *= $Big[10]
$r = $nr
}
Else
{
$nr = ( $Big[2] * $q + $r ) * $l
$nn = ( $q * ( $Big[7] * $k + $Big[2] ) + $r * $l ) / ( $t * $l )
$q *= $k
$t *= $l
$l += $Big[2]
$k = $k + $Big[1]
$n = $nn
$r = $nr
}
}
$Output
$Output = ""
}
}

View file

@ -0,0 +1 @@
[math]::pi

View file

@ -0,0 +1,2 @@
.Net digits of pi
3.14159265358979

32
Task/Pi/REXX/pi-2.rexx Normal file
View file

@ -0,0 +1,32 @@
/*REXX program spits out decimal digits of pi (one digit at a time) until Ctrl-Break.*/
signal on halt
parse arg digs oFID . /*obtain optional argument from the CL.*/
if digs=='' | digs=="," then digs= 300 /*Not specified? Then use the default.*/
if oFID=='' | oFID=="," then oFID='PI_SPIT2.OUT' /*" " " " " " */
numeric digits digs /*with bigger digs, spitting is slower.*/
q=1; r=0; t=1; k=1; n=3; L=3; z=0 /*define some REXX variables. */
dot=1 /*DOT≡a flag when a dot in pi is shown.*/
do until z==digs; qq= q+q /* qq is a fast version of: q*2 */
tn= t*n /* t*n is used twice (below). */
if qq+qq+r-t < tn then do; z= z+1 /* qq+qq is faster than qq*2 */
call charout , n
call charout oFID, n
if dot then do; dot=0; call charout , .
call charout oFID, .
end
nr= (r - tn) * 10
n = ((( (qq+q+r) * 10) / t) - n*10) %1
q = q*10
end
else do; nr= (qq+r) * L
tL= t*L
n = (q * (k*7 + 2) + r*L) / tL %1
q = q*k
t = tL
L = L+2
k = k+1
end /* %1≡fast way doing TRUNC of a number.*/
r=nr
end /*forever*/
exit
halt: say; say 'PI_SPIT2 halted via use of Ctrl-Break.'; exit

View file

@ -1,20 +0,0 @@
# Calculate Pi using the Arithmetic Geometric Mean of 1 and 1/sqrt(2)
#
#
# Nigel_Galloway
# March 8th., 2012.
#
require 'flt'
Flt::BinNum.Context.precision = 8192
a = n = 1
g = 1 / Flt::BinNum(2).sqrt
z = 0.25
(0..17).each{
x = [(a + g) * 0.5, (a * g).sqrt]
var = x[0] - a
z -= var * var * n
n += n
a = x[0]
g = x[1]
}
puts a * a / z

View file

@ -1,28 +0,0 @@
def pi
q, r, t, k, n, l = 1, 0, 1, 1, 3, 3
dot = nil
loop do
if 4*q+r-t < n*t
yield n
if dot.nil?
yield '.'
dot = '.'
end
nr = 10*(r-n*t)
n = ((10*(3*q+r)) / t) - 10*n
q *= 10
r = nr
else
nr = (2*q+r) * l
nn = (q*(7*k+2)+r*l) / (t*l)
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
end
end
end
pi {|digit| print digit; $stdout.flush}

View file

@ -1,26 +1,26 @@
func pi(callback) {
var (q, r, t, k, n, l) = (1, 0, 1, 1, 3, 3);
var (q, r, t, k, n, l) = (1, 0, 1, 1, 3, 3)
loop {
if ((4*q + r - t) < n*t) {
callback(n);
static _dot = callback('.');
var nr = 10*(r-n*t);
n = (int((10*(3*q + r)) / t) - 10*n);
q *= 10;
r = nr;
callback(n)
static _dot = callback('.')
var nr = 10*(r - n*t)
n = ((10*(3*q + r)) // t - 10*n)
q *= 10
r = nr
}
else {
var nr = ((2*q + r) * l);
var nn = int((q*(7*k + 2) + r*l) / (t*l));
q *= k;
t *= l;
l += 2;
k += 1;
n = nn;
r = nr;
var nr = ((2*q + r) * l)
var nn = ((q*(7*k + 2) + r*l) // (t*l))
q *= k
t *= l
l += 2
k += 1
n = nn
r = nr
}
}
}
STDOUT.autoflush(1);
pi(func(digit){ print digit });
 
STDOUT.autoflush(true)
pi(func(digit){ print digit })

24
Task/Pi/Zkl/pi.zkl Normal file
View file

@ -0,0 +1,24 @@
var [const] BN=Import("zklBigNum"),
one=BN(1), two=BN(2), three=BN(3), four=BN(4), seven=BN(7), ten=BN(10);
fcn calcPiDigits{
reg q=BN(1), r=BN(0), t=BN(1), k=BN(1), n=BN(3), l=BN(3);
first:=True; N:=0;
while(True){ if((N+=1)==1000){ GarbageMan.collect(); N=0; } // take a deep breath ...
if(four*q + r - t < n*t){
n.print(); if(first){ print("."); first=False; }
nr:=(r - n*t).mul(ten); // 10 * (r - n * t);
n=(three*q).add(r).mul(ten) // ((10*(3*q + r))/t) - 10*n;
.div(t).sub(ten*n);
q.mul(ten); // q *= 10;
r=nr;
}else{
nr:=(two*q).add(r).mul(l); // (2*q + r)*l;
nn:=(q*seven).mul(k).add(two) // (q*(7*k + 2) + r*l)/(t*l);
.add(r*l).div(t*l);
q.mul(k); t.mul(l); // q*=k; t*=l;
l.add(two); k.add(one); // l+=2; k++;
n=nn; r=nr;
}
}
}();