""" de Broglie relation (p = h/λ). Assertion-based CAS audit block. Pillar: Particle Mechanics | Chain: constitutive postulate p=h/λ → photon dictionary check → wave number CalRef: Math Appendix §4A, Particle Mechanics Calibration §3C """ def run(): from sympy import symbols, simplify, pi, sqrt print('=== CAS AUDIT: F0028 — de Broglie relation ===\n') pass_count = 0 fail_count = 0 total_steps = 0 h_pl, lambda_db, p_mom = symbols('h_pl lambda_db p_mom', real=True, positive=True) nu, c_light = symbols('nu c_light', real=True, positive=True) E_ph = symbols('E_ph', real=True, positive=True) k_wave = symbols('k_wave', real=True, positive=True) hbar = symbols('hbar', real=True, positive=True) # de Broglie postulate p_deBroglie = h_pl / lambda_db print('Section D: Step log') print('---------------------------------------------') # --- Step 1: Constitutive relation --- res1 = simplify(p_deBroglie * lambda_db - h_pl) total_steps += 1 if simplify(res1) == 0: print(' Step 1 PASS — p·λ = h (constitutive relation)') pass_count += 1 else: print(' Step 1 FAIL') fail_count += 1 # --- Step 2: Wavelength from momentum --- lambda_from_p = h_pl / p_mom p_check = h_pl / lambda_from_p res2 = simplify(p_check - p_mom) total_steps += 1 if simplify(res2) == 0: print(' Step 2 PASS — λ = h/p → p = h/λ (round-trip)') pass_count += 1 else: print(' Step 2 FAIL') fail_count += 1 # --- Step 3: Photon dictionary consistency --- E_photon = h_pl * nu lambda_photon = c_light / nu p_photon_energy = E_photon / c_light p_photon_deBroglie = h_pl / lambda_photon res3 = simplify(p_photon_energy - p_photon_deBroglie) total_steps += 1 if simplify(res3) == 0: print(' Step 3 PASS — Photon: p = E/c = hν/c = h/λ (dictionary consistent)') pass_count += 1 else: print(' Step 3 FAIL') fail_count += 1 # --- Step 4: Wave number form --- p_wn_explicit = (h_pl / (2*pi)) * (2*pi / lambda_db) res4 = simplify(p_wn_explicit - p_deBroglie) total_steps += 1 if simplify(res4) == 0: print(' Step 4 PASS — p = ℏk = h/λ (wave number form)') pass_count += 1 else: print(' Step 4 FAIL') fail_count += 1 # --- Step 5: Energy-momentum for photons --- E_from_p = p_deBroglie * c_light E_from_nu = h_pl * nu E_sub = E_from_p.subs(lambda_db, c_light/nu) res5 = simplify(E_sub - E_from_nu) total_steps += 1 if simplify(res5) == 0: print(' Step 5 PASS — E = pc = hc/λ = hν (photon energy-momentum)') pass_count += 1 else: print(' Step 5 FAIL') fail_count += 1 # --- Step 6: Nonrelativistic kinetic energy --- m_part = symbols('m_part', real=True, positive=True) T_kin = p_deBroglie**2 / (2*m_part) T_expected = h_pl**2 / (2*m_part*lambda_db**2) res6 = simplify(T_kin - T_expected) total_steps += 1 if simplify(res6) == 0: print(' Step 6 PASS — T = p²/(2m) = h²/(2mλ²)') pass_count += 1 else: print(' Step 6 FAIL') fail_count += 1 # --- Step 7: Numerical — electron at 100 eV --- h_val = 6.62607015e-34 m_e = 9.1093837015e-31 eV = 1.602176634e-19 T_100eV = 100 * eV p_val = sqrt(2 * m_e * T_100eV) lambda_val = h_val / p_val lambda_expected_nm = 0.1226 lambda_calc_nm = lambda_val * 1e9 total_steps += 1 if abs(lambda_calc_nm - lambda_expected_nm) < 0.005: print(f' Step 7 PASS — 100 eV electron: λ = {lambda_calc_nm:.4f} nm (expected ≈ 0.123 nm)') pass_count += 1 else: print(' Step 7 FAIL') fail_count += 1 # --- Step 8: Numerical — photon at visible (550 nm) --- lambda_vis = 550e-9 p_photon_val = h_val / lambda_vis p_expected = 1.205e-27 total_steps += 1 if abs(p_photon_val - p_expected)/p_expected < 0.01: print(f' Step 8 PASS — 550 nm photon: p = {p_photon_val:.3e} kg·m/s') pass_count += 1 else: print(' Step 8 FAIL') fail_count += 1 # --- Step 9: Cross-block — F0013 wave quantization --- n_q = symbols('n_q', real=True, positive=True) L_box = symbols('L_box', real=True, positive=True) k_n = 2*pi*n_q / L_box p_n = (h_pl/(2*pi)) * k_n res9 = simplify(p_n - h_pl*n_q/L_box) pL = p_n * L_box res9b = simplify(pL - n_q*h_pl) total_steps += 1 if simplify(res9) == 0 and simplify(res9b) == 0: print(' Step 9 PASS — p_n = hn/L, p·L = nh (consistent with F0013)') pass_count += 1 else: print(' Step 9 FAIL') fail_count += 1 # --- Step 10: Self-test — wrong relation --- p_wrong = h_pl * lambda_db res_wrong = simplify(p_wrong - p_deBroglie) total_steps += 1 if not (simplify(res_wrong) == 0): print(' Step 10a PASS — Wrong p=h·λ detected as incorrect') pass_count += 1 else: print(' Step 10a FAIL') fail_count += 1 res_quant = simplify(res_wrong - h_pl*(lambda_db - 1/lambda_db)) total_steps += 1 if simplify(res_quant) == 0: print(' Step 10b PASS — Wrong residual = h(λ−1/λ) (quantified)') pass_count += 1 else: print(' Step 10b FAIL') fail_count += 1 print('---------------------------------------------\n') # ---- VERDICT ---- print('=============================================') print(' F0028 AUDIT RESULT') print(f' Steps: {total_steps} | Pass: {pass_count} | Fail: {fail_count}') if fail_count == 0: print(' STATUS: *** PASS ***') else: print(f' STATUS: *** FAIL *** ({fail_count} step(s) failed)') print('=============================================') print(f' ✓ F0028 — {pass_count}/{total_steps} PASS') if __name__ == '__main__': run()