nx_theorems6_test.nx source
↩ module page · 119 lines · 5372 B
1// nx_theorems6_test.nx -- Freek-100 medium difficulty smoke.
2
3import "syscalls.nx"
4import "nx_complex.nx"
5import "nx_poly.nx"
6import "nx_graph.nx"
7import "nx_qed_freek.nx"
8
9func main() -> i64 {
10 // Freek #17 -- DeMoivre: i^4 = 1, i^2 = -1.
11 if nx_th_demoivre_i_power_4_check() != 1 { return 17 }
12 if nx_th_demoivre_i_power_2_check() != 1 { return 18 }
13
14 // Freek #27 -- triangle angles sum 180.
15 if nx_th_triangle_angle_sum_check(60, 60, 60) != 1 { return 27 }
16 if nx_th_triangle_angle_sum_check(90, 45, 45) != 1 { return 28 }
17 if nx_th_triangle_angle_sum_check(50, 60, 60) != 0 { return 29 }
18
19 // Freek #37 -- cubic discriminant. For t^3 + pt + q:
20 // p=0, q=0 -> disc = 0 (triple root at 0).
21 if nx_th_cubic_discriminant(0, 0) != 0 { return 37 }
22 // p=-3, q=2 -> disc = -4*(-27) - 27*4 = 108 - 108 = 0 (double root).
23 if nx_th_cubic_discriminant(-3, 2) != 0 { return 38 }
24 // p=-3, q=0 -> disc = -4*(-27) - 0 = 108 (three real distinct roots).
25 if nx_th_cubic_discriminant(-3, 0) != 108 { return 39 }
26
27 // Freek #54 -- Konigsberg bridges: no Eulerian circuit.
28 if nx_th_konigsberg_check() != 1 { return 54 }
29
30 // Freek #55 -- chord segments: 2*6 = 3*4 = 12.
31 if nx_th_power_of_point_check(2, 6, 3, 4) != 1 { return 55 }
32 if nx_th_power_of_point_check(2, 6, 3, 5) != 0 { return 56 }
33
34 // Freek #70 -- perfect numbers: P_2 = 2^1 * 3 = 6; P_3 = 2^2 * 7 = 28.
35 if nx_th_perfect_number(2) != 6 { return 70 }
36 if nx_th_perfect_number(3) != 28 { return 71 }
37 // Brute-force verify 28 is perfect: divisors 1+2+4+7+14 = 28.
38 if nx_th_is_perfect_brute(28) != 1 { return 72 }
39 if nx_th_is_perfect_brute(12) != 0 { return 73 }
40
41 // Freek #73 -- Erdős-Szekeres on [3,1,4,1,5,9,2,6] of length 8.
42 // (3-1)(3-1)+1 = 5, so r=3, s=3 should hold.
43 // LIS: e.g., 1,4,5,9 or 1,4,5,6 = length 4 >= 3.
44 // LDS: e.g., 3,1 or 9,6 = length 2.
45 let seq: *i64 = (sys_mmap(64)) as *i64
46 seq[0]=3; seq[1]=1; seq[2]=4; seq[3]=1; seq[4]=5; seq[5]=9; seq[6]=2; seq[7]=6
47 if nx_th_erdos_szekeres_check(seq, 8, 3, 3) != 1 { return 80 }
48 if nx_th_lis_length(seq, 8) < 4 { return 81 }
49
50 // Freek #77 -- Faulhaber. sum k for n=10 = 55. sum k^2 for n=5 = 55.
51 // sum k^3 for n=3 = 1+8+27 = 36 = (3*4/2)^2 = 36.
52 if nx_th_faulhaber_p_check(10, 1) != 1 { return 90 }
53 if nx_th_faulhaber_p_check(5, 2) != 1 { return 91 }
54 if nx_th_faulhaber_p_check(3, 3) != 1 { return 92 }
55 if nx_th_faulhaber_1_closed(10) != 55 { return 93 }
56 if nx_th_faulhaber_2_closed(5) != 55 { return 94 }
57 if nx_th_faulhaber_3_closed(3) != 36 { return 95 }
58
59 // Freek #83 -- Friendship. K_4 (complete graph on 4 verts).
60 let adj: *i64 = (sys_mmap(64)) as *i64
61 var i: i64 = 0
62 while i < 16 { adj[i] = 0; i = i + 1 }
63 // Wheel graph W_3: center + 3 outer connected to center and to each other.
64 // Center = vertex 0; outer = 1,2,3.
65 adj[0*4+1]=1; adj[1*4+0]=1
66 adj[0*4+2]=1; adj[2*4+0]=1
67 adj[0*4+3]=1; adj[3*4+0]=1
68 adj[1*4+2]=1; adj[2*4+1]=1
69 adj[2*4+3]=1; adj[3*4+2]=1
70 adj[1*4+3]=1; adj[3*4+1]=1 // making it K_4
71 // Now every vertex has degree 3 = n-1 -> all are politicians.
72 if nx_graph_friendship_politician(adj, 4) < 0 { return 100 }
73
74 // Freek #92 -- Pick.
75 if nx_th_pick_unit_square_check() != 1 { return 110 }
76 // Triangle with vertices (0,0), (4,0), (0,3): I=3, B=8 (3+4+5 lattice points on edges?
77 // 3-4-5 triangle: B = gcd(4,0)+gcd(0,3)+gcd(4,3) = 4+3+1 = 8. Area = 6.
78 // Pick: 6 = I + 4 - 1 -> I = 3. double_area = 2*3 + 8 - 2 = 12.
79 if nx_th_pick_double_area(3, 8) != 12 { return 111 }
80
81 // Freek #97 -- Cramer 2x2. System: 2x + y = 5, x + 3y = 10.
82 // det = 6 - 1 = 5. det_x = 5*3 - 10 = 5. x = 1. det_y = 20 - 5 = 15. y = 3.
83 if nx_th_cramer_2x2_x(2, 1, 1, 3, 5, 10) != 1 { return 120 }
84 if nx_th_cramer_2x2_y(2, 1, 1, 3, 5, 10) != 3 { return 121 }
85
86 // Freek #75 -- MVT witness. f(x) = x^2 on [0, 2]: avg slope = (4-0)/2 = 2.
87 // f'(x) = 2x. c with 2c = 2 -> c = 1.
88 let cf: *i64 = (sys_mmap(24)) as *i64
89 cf[0] = 0; cf[1] = 0; cf[2] = 1
90 let out_c: *i64 = (sys_mmap(8)) as *i64
91 if nx_th_mvt_witness(cf, 2, 0, 2, out_c) != 1 { return 130 }
92 if out_c[0] != 1 { return 131 }
93
94 // Freek #99 -- Buffon: L=D=1.0 -> prob = 2/pi ~ 0.6366.
95 let bp: i64 = nx_th_buffon_prob_ppb(1000000000, 1000000000)
96 if bp < 600000000 { return 140 }
97 if bp > 650000000 { return 141 }
98
99 // Freek #42 -- recip triangular partial. N=10 -> 2*10/11 ~ 1.818.
100 let rt: i64 = nx_th_recip_triangular_partial_ppb(10)
101 if rt < 1800000000 { return 150 }
102 if rt > 1820000000 { return 151 }
103
104 // Freek #67 -- geom inf sum. r=0.5 -> 1/(1-0.5) = 2.
105 let gi: i64 = nx_th_geom_infinite_sum_ppb(500000000)
106 if gi != 2000000000 { return 160 }
107
108 // Freek #25 -- Schroder-Bernstein verify on injective fns.
109 let f: *i64 = (sys_mmap(40)) as *i64
110 let g: *i64 = (sys_mmap(40)) as *i64
111 f[0]=0; f[1]=1; f[2]=2; f[3]=3; f[4]=4
112 g[0]=0; g[1]=1; g[2]=2; g[3]=3; g[4]=4
113 if nx_th_schroder_bernstein_verify(f, g, 5) != 1 { return 170 }
114 // Make f non-injective.
115 f[2] = 1
116 if nx_th_schroder_bernstein_verify(f, g, 5) != 0 { return 171 }
117
118 return 0
119}