nx_theorems7_test.nx source
↩ module page · 119 lines · 5419 B
1// nx_theorems7_test.nx -- batch 7 verification.
2
3import "syscalls.nx"
4import "nx_qed_freek.nx"
5
6func main() -> i64 {
7 // Freek #5 PNT: pi(10) = 4 ({2,3,5,7}); pi(20) = 8.
8 if nx_th_prime_count(10) != 4 { return 5 }
9 if nx_th_prime_count(20) != 8 { return 6 }
10 if nx_th_prime_count(100) != 25 { return 7 }
11
12 // Freek #7 Quadratic reciprocity.
13 // Legendre(2, 7): 2 a QR mod 7? 1,4,2,2,4,1 are residues -> 2 is QR -> 1.
14 if nx_th_legendre_symbol(2, 7) != 1 { return 8 }
15 // Legendre(3, 7): residues 1,2,4 -> 3 not QR -> -1.
16 if nx_th_legendre_symbol(3, 7) != -1 { return 9 }
17 // QR check (3, 5): both odd primes.
18 if nx_th_quadratic_reciprocity_check(3, 5) != 1 { return 10 }
19 if nx_th_quadratic_reciprocity_check(5, 7) != 1 { return 11 }
20
21 // Freek #9 Circle area. r=2 -> pi*4 ~ 12.566.
22 let a2: i64 = nx_th_circle_area_ppb(2000000000)
23 if a2 < 12000000000 { return 12 }
24 if a2 > 13000000000 { return 13 }
25
26 // Freek #14 Basel partial. N=10000: should approach pi^2/6.
27 // We test small N: N=100 partial ~ 1.6349, N=1000 ~ 1.6439.
28 let b1000: i64 = nx_th_basel_partial_ppb(1000)
29 if b1000 < 1640000000 { return 14 }
30 if b1000 > 1645000000 { return 15 }
31
32 // Freek #26 Leibniz. N=10000 should give pi/4 ~ 0.7854.
33 // Convergence is slow, partial N=1000 ~ 0.7849.
34 let l1000: i64 = nx_th_leibniz_pi_over_4_partial_ppb(1000)
35 if l1000 < 780000000 { return 16 }
36 if l1000 > 790000000 { return 17 }
37
38 // Freek #30 Ballot. p=5, q=3 -> (5-3)/(5+3) = 0.25.
39 if nx_th_ballot_prob_ppb(5, 3) != 250000000 { return 18 }
40 if nx_th_ballot_prob_ppb(10, 4) != nx_muldiv_i64(6, 1000000000, 14) { return 19 }
41
42 // Freek #45 Partition. p(0)=1, p(1)=1, p(2)=2, p(3)=3, p(4)=5, p(5)=7.
43 if nx_th_partition(0) != 1 { return 20 }
44 if nx_th_partition(1) != 1 { return 21 }
45 if nx_th_partition(2) != 2 { return 22 }
46 if nx_th_partition(3) != 3 { return 23 }
47 if nx_th_partition(4) != 5 { return 24 }
48 if nx_th_partition(5) != 7 { return 25 }
49 if nx_th_partition(10) != 42 { return 26 }
50
51 // Freek #46 Quartic resolvent. p=-1, q=0, r=-2:
52 // coef0 = 4*(-1)*(-2) - 0 = 8
53 // coef1 = -8 * (-2) = 16
54 // coef2 = -4 * (-1) = 4
55 if nx_th_quartic_resolvent_coef0(-1, 0, -2) != 8 { return 27 }
56 if nx_th_quartic_resolvent_coef1(-1, 0, -2) != 16 { return 28 }
57 if nx_th_quartic_resolvent_coef2(-1, 0, -2) != 4 { return 29 }
58
59 // Freek #47 CLT z-score. sum=500 over N=100 samples (with sum
60 // representing PPB count); mu=5 PPB-scaled; sigma=1. Sample mean
61 // PPB = 500e9 / 100 = 5e9 = 5. Z = (5-5)/(1/10) = 0. PPB = 0.
62 let z: i64 = nx_th_clt_z_score_ppb(500, 100, 5000000000, 1000000000)
63 if z != 0 { return 30 }
64 // isqrt sanity: isqrt(100) = 10.
65 if nx_math_isqrt(100) != 10 { return 31 }
66 if nx_math_isqrt(10000) != 100 { return 32 }
67
68 // Freek #48 Dirichlet: first prime in 1 + 4k AP. 1, 5, 9, 13... -> 5.
69 if nx_th_dirichlet_first_prime_in_ap(1, 4, 100) != 5 { return 33 }
70 if nx_th_dirichlet_first_prime_in_ap(3, 8, 100) != 3 { return 34 }
71
72 // Freek #59 LLN. After N=100 samples of sum=500 (mean 5), mu=5 -> dev=0.
73 if nx_th_lln_deviation_ppb(500, 100, 5000000000) != 0 { return 35 }
74 // sum=499 over N=100, mu=5 -> sample mean = 4.99, dev = 0.01e9 = 10M.
75 if nx_th_lln_deviation_ppb(499, 100, 5000000000) != 10000000 { return 36 }
76
77 // Freek #62 Fair game. Start=10, deltas (+1,-1,+1,-1) -> end=10.
78 let deltas: *i64 = (sys_mmap(40)) as *i64
79 deltas[0] = 1; deltas[1] = -1; deltas[2] = 1; deltas[3] = -1
80 if nx_th_fair_game_balance(10, deltas, 4) != 10 { return 37 }
81
82 // Freek #64 L'Hopital. f(x)=x^2-1, g(x)=x-1 at a=1. f(1)=0, g(1)=0.
83 // f'=2x, g'=1. Limit = 2*1/1 = 2.
84 let f: *i64 = (sys_mmap(24)) as *i64
85 f[0] = -1; f[1] = 0; f[2] = 1 // x^2 - 1
86 let g: *i64 = (sys_mmap(24)) as *i64
87 g[0] = -1; g[1] = 1 // x - 1
88 let num: *i64 = (sys_mmap(8)) as *i64
89 let den: *i64 = (sys_mmap(8)) as *i64
90 if nx_th_lhopital_ratio(f, 2, g, 1, 1, num, den) != 1 { return 38 }
91 if num[0] != 2 { return 39 }
92 if den[0] != 1 { return 40 }
93
94 // Freek #84 Morley equilateral.
95 if nx_th_morley_equilateral_input_check(60, 60, 60) != 1 { return 41 }
96 if nx_th_morley_equilateral_input_check(50, 60, 70) != 0 { return 42 }
97
98 // Freek #35 Taylor. f(x) = x^2 around a=0, evaluated at x=3:
99 // f(3) = 9. Taylor order 2 should equal 9 exactly (polynomial).
100 let fp: *i64 = (sys_mmap(24)) as *i64
101 fp[0] = 0; fp[1] = 0; fp[2] = 1
102 if nx_th_taylor_eval_order_n(fp, 2, 0, 3, 2) != 9 { return 43 }
103 // f(x) = x^3 + x at a=1, evaluated at x=2, order 3:
104 // f(2) = 8 + 2 = 10. Taylor order 3 exact for cubic.
105 let fc: *i64 = (sys_mmap(32)) as *i64
106 fc[0] = 0; fc[1] = 1; fc[2] = 0; fc[3] = 1
107 if nx_th_taylor_eval_order_n(fc, 3, 1, 2, 3) != 10 { return 44 }
108
109 // Freek #22 Cantor diagonal: matrix all 0s -> diagonal complement all 1s.
110 let m: *i64 = (sys_mmap(80)) as *i64
111 var i: i64 = 0
112 while i < 16 { m[i] = 0; i = i + 1 }
113 let out_d: *i64 = (sys_mmap(40)) as *i64
114 nx_th_cantor_diagonal(m, 4, out_d)
115 if out_d[0] != 1 { return 45 }
116 if out_d[3] != 1 { return 46 }
117
118 return 0
119}