SilverSight/fortran/hachimoji_encode.f90
allaun 3b6baec64e wip: durability snapshot of local working tree (pre-existing, uncommitted)
Snapshot of previously-uncommitted local work so nothing is lost after the
power outage. NOT reviewed for correctness — a WIP checkpoint, not a feature:
- multi-language hachimoji encoders (c/cpp/fortran/julia/octave/r/scala/go/rust/coq)
- formal Lean WIP (BraidTree, Eisenstein, HachimojiCapture, MathlibConnect,
  ModularFormBridge, ClusterManifold) + lakefile + E8Sidon edit
- docs/, experiments/ (epyc oisc benches), deploy/, scripts, test scaffolding
- .gitignore: exclude **/target/ and Coq build artifacts

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 20:49:53 -05:00

227 lines
8.1 KiB
Fortran

program hachimoji_encode_demo
implicit none
integer, parameter :: i64 = selected_int_kind(15)
character(len=6), parameter :: LETTER_NAMES(8) = &
[character(len=6) :: "Phi", "Lambda", "Rho", "Kappa", &
"Omega", "Sigma", "Pi", "Zeta"]
call run_tests()
contains
! sigma3(n) = Sum_{d|n} d^3 (0 for n=0)
integer(i64) function sigma3(n) result(s)
integer(i64), intent(in) :: n
integer(i64) :: d, c
s = 0_i64
if (n == 0_i64) return
d = 1_i64
do while (d * d <= n)
if (mod(n, d) == 0_i64) then
s = s + d * d * d
c = n / d
if (c /= d) s = s + c * c * c
end if
d = d + 1_i64
end do
end function sigma3
! Map sigma3 value to Hachimoji letter index 0-7
integer function hachimoji_letter(s) result(idx)
integer(i64), intent(in) :: s
idx = int(mod(s, 8_i64))
end function hachimoji_letter
! Cartan energy between two Hachimoji letter indices
integer function cartan_weight(a, b) result(w)
integer, intent(in) :: a, b
if (a == b) then
w = 273
else if (a / 2 == b / 2) then
w = 256
else
w = 0
end if
end function cartan_weight
! AngrySphinx gate: check if integer list passes energy budget.
! passed = 1 if collisions <= 1, else 0.
subroutine angrysphinx_gate(elements, n, passed, collisions, energy)
integer, intent(in) :: elements(:)
integer, intent(in) :: n
integer, intent(out) :: passed
integer, intent(out) :: collisions
integer, intent(out) :: energy
integer, allocatable :: sums(:)
integer :: npairs, i, j, idx, raw
npairs = n * (n + 1) / 2
allocate(sums(npairs))
idx = 1
do i = 1, n
do j = i, n
sums(idx) = elements(i) + elements(j)
idx = idx + 1
end do
end do
collisions = 0
do i = 1, npairs
do j = i + 1, npairs
if (sums(i) == sums(j)) collisions = collisions + 1
end do
end do
deallocate(sums)
raw = 273 + 17 * collisions
if (raw < 256 * collisions) then
energy = 0
else
energy = raw - 256 * collisions
end if
if (collisions <= 1) then
passed = 1
else
passed = 0
end if
end subroutine angrysphinx_gate
! Full encoding: compute sigma3, letter index, print row
subroutine hachimoji_encode(n)
integer(i64), intent(in) :: n
integer(i64) :: s
integer :: idx
s = sigma3(n)
idx = hachimoji_letter(s)
write(*, '(2X, I4, 2X, I10, 2X, I2, 3X, A)') &
int(n), int(s), idx, trim(LETTER_NAMES(idx + 1))
end subroutine hachimoji_encode
subroutine run_tests()
integer(i64) :: n
integer :: i, j, c, e, p
integer :: elems(10)
! ---------- sigma3 assertions ----------
call assert_eq_i64(sigma3(0_i64), 0_i64, "sigma3(0)")
call assert_eq_i64(sigma3(1_i64), 1_i64, "sigma3(1)")
call assert_eq_i64(sigma3(2_i64), 9_i64, "sigma3(2)")
call assert_eq_i64(sigma3(3_i64), 28_i64, "sigma3(3)")
call assert_eq_i64(sigma3(4_i64), 73_i64, "sigma3(4)")
call assert_eq_i64(sigma3(5_i64), 126_i64, "sigma3(5)")
call assert_eq_i64(sigma3(6_i64), 252_i64, "sigma3(6)")
call assert_eq_i64(sigma3(7_i64), 344_i64, "sigma3(7)")
call assert_eq_i64(sigma3(8_i64), 585_i64, "sigma3(8)")
call assert_eq_i64(sigma3(9_i64), 757_i64, "sigma3(9)")
call assert_eq_i64(sigma3(10_i64), 1134_i64,"sigma3(10)")
! ---------- hachimoji_letter assertions ----------
call assert_eq_int(hachimoji_letter(1_i64), int(mod(1_i64, 8_i64)), "hachimoji_letter(1)")
call assert_eq_int(hachimoji_letter(9_i64), int(mod(9_i64, 8_i64)), "hachimoji_letter(9)")
call assert_eq_int(hachimoji_letter(28_i64), int(mod(28_i64, 8_i64)), "hachimoji_letter(28)")
call assert_eq_int(hachimoji_letter(73_i64), int(mod(73_i64, 8_i64)), "hachimoji_letter(73)")
call assert_eq_int(hachimoji_letter(126_i64), int(mod(126_i64, 8_i64)), "hachimoji_letter(126)")
call assert_eq_int(hachimoji_letter(252_i64), int(mod(252_i64, 8_i64)), "hachimoji_letter(252)")
call assert_eq_int(hachimoji_letter(344_i64), int(mod(344_i64, 8_i64)), "hachimoji_letter(344)")
call assert_eq_int(hachimoji_letter(585_i64), int(mod(585_i64, 8_i64)), "hachimoji_letter(585)")
call assert_eq_int(hachimoji_letter(757_i64), int(mod(757_i64, 8_i64)), "hachimoji_letter(757)")
call assert_eq_int(hachimoji_letter(1134_i64), int(mod(1134_i64, 8_i64)), "hachimoji_letter(1134)")
! ---------- cartan_weight assertions ----------
call assert_eq_int(cartan_weight(0, 0), 273, "cartan(0,0)")
call assert_eq_int(cartan_weight(0, 1), 256, "cartan(0,1)")
call assert_eq_int(cartan_weight(0, 2), 0, "cartan(0,2)")
call assert_eq_int(cartan_weight(2, 3), 256, "cartan(2,3)")
call assert_eq_int(cartan_weight(3, 5), 0, "cartan(3,5)")
call assert_eq_int(cartan_weight(7, 7), 273, "cartan(7,7)")
! ---------- AngrySphinx gate assertions ----------
elems(1:2) = [1, 2]
call angrysphinx_gate(elems, 2, p, c, e)
call assert_eq_int(p, 1, "gate [1,2] passed")
call assert_eq_int(c, 0, "gate [1,2] collisions")
call assert_eq_int(e, 273, "gate [1,2] energy")
elems(1:3) = [1, 2, 3]
call angrysphinx_gate(elems, 3, p, c, e)
call assert_eq_int(p, 1, "gate [1,2,3] passed")
call assert_eq_int(c, 1, "gate [1,2,3] collisions")
call assert_eq_int(e, 34, "gate [1,2,3] energy")
elems(1:4) = [1, 2, 3, 4]
call angrysphinx_gate(elems, 4, p, c, e)
call assert_eq_int(p, 0, "gate [1,2,3,4] passed")
call assert_eq_int(c, 3, "gate [1,2,3,4] collisions")
call assert_eq_int(e, 0, "gate [1,2,3,4] energy")
! ========== Formatted output ==========
write(*, *)
write(*, '(A)') "Hachimoji Encoder Test Vector"
write(*, '(A)') "================================="
write(*, '(A)') " n sigma3 Index Letter"
write(*, '(A)') " --- ------- ----- ------"
do n = 1_i64, 10_i64
call hachimoji_encode(n)
end do
write(*, *)
write(*, '(A)') "AngrySphinx Gate Tests"
write(*, '(A)') "============================="
write(*, '(A)') " Elements Passed Collisions Energy"
write(*, '(A)') " ----------------- ------ ---------- ------"
elems(1:2) = [1, 2]
call angrysphinx_gate(elems, 2, p, c, e)
write(*, '(2X, "[", I0, ",", I0, "]", T22, A, T30, I0, T42, I0)') &
elems(1), elems(2), merge("true ", "false", p == 1), c, e
elems(1:3) = [1, 2, 3]
call angrysphinx_gate(elems, 3, p, c, e)
write(*, '(2X, "[", I0, ",", I0, ",", I0, "]", T22, A, T30, I0, T42, I0)') &
elems(1), elems(2), elems(3), merge("true ", "false", p == 1), c, e
elems(1:4) = [1, 2, 3, 4]
call angrysphinx_gate(elems, 4, p, c, e)
write(*, '(2X, "[", I0, ",", I0, ",", I0, ",", I0, "]", T22, A, T30, I0, T42, I0)') &
elems(1), elems(2), elems(3), elems(4), merge("true ", "false", p == 1), c, e
! ---------- cartan matrix display ----------
write(*, *)
write(*, '(A)') "Cartan Weight Matrix (8 x 8)"
write(*, '(A)') "============================="
write(*, '(9X, 8(2X, A6))') (trim(LETTER_NAMES(i)), i = 1, 8)
do i = 1, 8
write(*, '(2X, A6, 8(2X, I6))') trim(LETTER_NAMES(i)), &
(cartan_weight(i - 1, j), j = 0, 7)
end do
write(*, *)
write(*, '(A)') "All assertions passed."
end subroutine run_tests
subroutine assert_eq_i64(actual, expected, label)
integer(i64), intent(in) :: actual, expected
character(len=*), intent(in) :: label
if (actual /= expected) then
write(*, '(A, A, A, I0, A, I0)') "FAIL: ", trim(label), &
" expected ", expected, " got ", actual
stop 1
end if
end subroutine assert_eq_i64
subroutine assert_eq_int(actual, expected, label)
integer, intent(in) :: actual, expected
character(len=*), intent(in) :: label
if (actual /= expected) then
write(*, '(A, A, A, I0, A, I0)') "FAIL: ", trim(label), &
" expected ", expected, " got ", actual
stop 1
end if
end subroutine assert_eq_int
end program hachimoji_encode_demo