Data update

This commit is contained in:
Ingy döt Net 2024-07-13 15:19:22 -07:00
parent 29a5eea0d4
commit 5c1bb7bfa9
2011 changed files with 35081 additions and 3229 deletions

View file

@ -0,0 +1,146 @@
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program calculPi64.s */
/* for algorithm see a french site : http://www.yann-ollivier.org/pi/pi.php */
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
.equ NBVAL, 8400 //(2400 decimales) or 16800 (4800 décimales) or 33600 (9600 decimales)
.equ BASE, 10000
//.include "../ficmacros32.inc" // for debugging developper
/************************************/
/* Initialized data */
/************************************/
.data
szCarriageReturn: .asciz "\n"
szMessStart: .asciz "Program 64 bits start.\n"
szNBZero1: .asciz "0"
szNBZero2: .asciz "00"
szNBZero3: .asciz "000"
.align 2
/************************************/
/* UnInitialized data */
/************************************/
.bss
sZoneConv: .skip 24
ibuffer: .skip 4 * (NBVAL+1)
/************************************/
/* code section */
/************************************/
.text
.global main
main: // entry of program
ldr x0,qAdrszMessStart
bl affichageMess
ldr x7,iA
mov x0,x7
mov x1,#5
udiv x2,x0,x1 // A / 5
mov x1,#0
ldr x8,qAdribuffer
ldr x9,iC // C
1: // init start array
str w2,[x8,x1, lsl #2] // store A/5
add x1,x1,#1
cmp x1,x9
blt 1b
mov x10,#0 // E
2: // begin loop 1
mov x4,#0 // D
lsl x5,x9,#1 // G
mov x6,x9 // B
3: // loop 2
ldr w1,[x8,x6, lsl #2]
mul x1,x7,x1 //
add x4,x4,x1 // new D
sub x5,x5,#1 // g = g -1
mov x0,x4 // D
mov x1,x5 // G
udiv x2,x0,x1
msub x3,x1,x2,x0
str w3,[x8,x6, lsl #2] // D modulo G
mov x4,x2
sub x5,x5,#1 // G=G-1
subs x6,x6,#1 // B=B-1
ble 4f // end loop 2 ?
mul x4,x6,x4 // no compute new D
b 3b // and loop 2
4:
mov x0,x4 // D
mov x1,x7 // A
udiv x2,x0,x1
msub x3,x1,x2,x0
add x0,x2,x10 // D/A + E
bl afficherDecimale
mov x10,x3 // E=D modulo A
subs x9,x9,#14
bgt 2b // end loop 1 ?
100: // standard end of the program
mov x0, #0 // return code
mov x8,EXIT
svc 0 // perform the system call
qAdrsZoneConv: .quad sZoneConv
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrszMessStart: .quad szMessStart
qAdribuffer: .quad ibuffer
iA: .quad BASE
iC: .quad NBVAL
/******************************************************************/
/* Display decimales */
/******************************************************************/
/* x0 contains decimale */
afficherDecimale:
stp x4,lr,[sp,-16]! // save registers
mov x4,x0
ldr x1,ival1
cmp x0,x1
bgt 3f
cmp x0,#99
ble 1f
ldr x0,qAdrszNBZero1 // display 1 zero
bl affichageMess
mov x0,x4
b 3f
1:
cmp x0,#9
ble 2f
ldr x0,qAdrszNBZero2 // display 2 zeroes
bl affichageMess
mov x0,x4
b 3f
2:
ldr x0,qAdrszNBZero3 // display 3 zeroes
bl affichageMess
mov x0,x4
3: // conversion and display
ldr x1,qAdrsZoneConv
bl conversion10 // decimal conversion
mov x2,#0
strb w2,[x1,x0]
ldr x0,qAdrsZoneConv
bl affichageMess
100:
ldp x4,lr,[sp],16 // restaur registers
ret
ival1: .quad 999
qAdrszNBZero1: .quad szNBZero1
qAdrszNBZero2: .quad szNBZero2
qAdrszNBZero3: .quad szNBZero3
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeARM64.inc"

155
Task/Pi/ARM-Assembly/pi.arm Normal file
View file

@ -0,0 +1,155 @@
/* ARM assembly Raspberry PI */
/* program calculPi.s Spigot algorithm */
/* conversion to Pascal */
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language ARM assembly*/
.include "../constantes.inc"
.equ NBVAL, 3000
.equ LEN, 10 * NBVAL / 3 @ 10000
//.include "../ficmacros32.inc" @ for debugging developper
/************************************/
/* Initialized data */
/************************************/
.data
szCarriageReturn: .asciz "\n"
szMessStart: .asciz "Program 32 bits start.\n"
szVal9: .asciz "9"
szVal0: .asciz "0"
.align 2
/************************************/
/* UnInitialized data */
/************************************/
.bss
sZoneConv: .skip 24
ibuffer: .skip 4 * (LEN+1)
/************************************/
/* code section */
/************************************/
.text
.global main
main: @ entry of program
ldr r0,iAdrszMessStart
bl affichageMess
ldr r12,iN
ldr r10,iLen
mov r1,#0
ldr r8,iAdribuffer
mov r2,#2
1: @ init start array loop
str r2,[r8,r1, lsl #2] @ store 2
add r1,#1
cmp r1,r10
blt 1b
mov r9,#0 @ nine
mov r7,#0 @ predigit
mov r6,#0 @ j
2: @ begin loop 1
mov r5,#0 @ q
sub r4,r10,#1 @ i
3: @ loop 2
ldr r0,[r8,r4, lsl #2] @ load value
mov r1,#10
mul r0,r1,r0 @ val * 10
mul r1,r5,r4 @ q *i
add r0,r1
lsl r1,r4,#1 @ divisor =i *2
sub r1,#1 @ - 1
bl division
str r3,[r8,r4, lsl #2] @ modulo 2i-1
mov r5,r2 @ q
subs r4,#1 @ decremente i
bgt 3b @ end loop 2
mov r0,r5
mov r1,#10
bl division
str r3,[r8,#4] @ poste 0 = q mod 10
mov r5,r2 @ q = q/10
cmp r5,#9
beq 7f
cmp r5,#10
beq 5f
mov r0,r7
bl afficherPredigit
mov r7,r5 @ predigit=q
cmp r9,#0 @ nine
beq 8f
mov r1,#1 @ else
4:
cmp r1,r9
bgt 41f
ldr r0,iAdrszVal9
bl affichageMess
add r1,#1
b 4b
41:
mov r9,#0 @ raz nine
b 8f
5: @ q = 10
add r0,r7,#1
bl afficherPredigit
mov r7,#0 @ predigit=0
mov r1,#1
6:
cmp r1,r9
bgt 61f
ldr r0,iAdrszVal0
bl affichageMess
add r1,#1
b 6b
61:
mov r9,#0 @ raz nine
b 8f
7:
add r9,#1
8:
add r6,#1
cmp r6,r12
ble 2b @ end loop 1 ?
mov r0,r7
bl afficherPredigit
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc 0 @ perform the system call
iAdrsZoneConv: .int sZoneConv
iAdrszCarriageReturn: .int szCarriageReturn
iAdrszMessStart: .int szMessStart
iAdribuffer: .int ibuffer
iN: .int NBVAL
iLen: .int LEN
iAdrszVal9: .int szVal9
iAdrszVal0: .int szVal0
/******************************************************************/
/* Display predigit */
/******************************************************************/
/* r0 contains decimale */
afficherPredigit:
push {r4,lr} @ save registers
mov r4,r0
ldr r1,iAdrsZoneConv
bl conversion10 @ decimal conversion
mov r2,#0
strb r2,[r1,r0]
ldr r0,iAdrsZoneConv
bl affichageMess
100:
pop {r4,pc} @ restaur registers
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language ARM assembly*/
.include "../affichage.inc"

27
Task/Pi/Standard-ML/pi.ml Normal file
View file

@ -0,0 +1,27 @@
(* https://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/spigot.pdf *)
fun gibbons _ _ _ _ _ _ 0 = ()
| gibbons q r t k n l count =
let
val (q',r',t',k',n',l',count') =
if 4*q+r-t < n*t
then (10*q,10*(r-n*t),t,k,(10*(3*q+r)) div t-10*n,l,count-1) before print (IntInf.toString n)
else (q*k,(2*q+r)*l,t*l,k+1,(q*(7*k+2)+r*l) div (t*l),l+2,count)
in
gibbons q' r' t' k' n' l' count'
end
fun doGibbons n = gibbons 1 0 1 1 3 3 n
fun timeGibbons n =
let
val timer1 = Timer.startCPUTimer ()
val () = doGibbons n
val {usr=usr, sys=sys} = Timer.checkCPUTimer timer1
in
print "\n----------------------\n";
print ("usr: " ^ Time.toString usr ^ "\n");
print ("sys: " ^ Time.toString sys ^ "\n")
end
fun main () = timeGibbons 5000

48
Task/Pi/UNIX-Shell/pi.sh Normal file
View file

@ -0,0 +1,48 @@
base=10;
gen_pi_digits(){
base_places=$1 yield=$2
((nine=base - 1));
local nines=0 predigit=0; # first predigit is_a 0 #
declare -a digits; # [base_places*10 over 3]#long# ; # we need 3 times the digits to calculate #
lwb_digits=1;
((upb_digits=base_places*10 / 3));
for((place=lwb_digits; place<=upb_digits; place++)); do digits[$place]=2; done; # start with 2s #
for((place=1; place<=base_places + 1; place++)); do
digit=0;
for((i=upb_digits; i>=lwb_digits; i--)); do # work backwards #
((x=base*digits[i] + digit*i));
((digits[i]=x%(2*i-1)));
((digit=x/(2*i-1)))
done;
((digits[lwb_digits]=digit % base)); ((digit/=base));
# nines := #
if((digit == nine)); then
((nines=nines + 1))
else
if((digit == base)); then
((out=predigit+1));
$yield $out; predigit=0;
for((repeats=1; repeats<=nines; repeats++)); do $yield 0; done
else
if((place != 1)); then $yield $predigit; fi; predigit=$digit;
for((repeats=1; repeats<=nines; repeats++)); do $yield $nine; done
fi;
nines=0
fi
done;
$yield $predigit
};
print_digit(){
echo -n $1
}
# feynman_point=762; # feynman_point + 4 is a good test case
# the 33rd decimal place is a shorter tricky test case #
target="3.1415926.......................502";
((test_decimal_places=${#target}-2)); # upb
# iterate throught the digits as they are being found #
gen_pi_digits $test_decimal_places print_digit
echo # (new_line)