code wiki / (root) / nx_theorems6_test.nx

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}