package main import ( "fmt" "log/slog" ) func main() { // fib_lfsr() galois_lfsr() } /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ func fib_lfsr() { startState := uint16(0xACE1) lfsr := startState var bit uint16 period := uint64(0) for { slog.Info("fib_lfsr", "bit", fmt.Sprintf("%01b", lfsr&1), "lfsr", fmt.Sprintf("%016b", lfsr)) bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5)) & 1 lfsr = (lfsr >> 1) | (bit << 15) period++ if period == 15 { break } if lfsr == startState { break } } println(period) } /* taps: 16 14 13 11; feedback polynomial: x^16 + x^14 + x^13 + x^11 + 1 */ func galois_lfsr() { startState := uint16(0xACE1) lfsr := startState var bit uint16 period := uint64(0) for { slog.Info("galois_lfsr", "bit", fmt.Sprintf("%01b", lfsr&1), "lfsr", fmt.Sprintf("%016b", lfsr)) bit = lfsr & 1 lfsr >>= 1 if bit == 1 { lfsr ^= 0xB400 } period++ // if period == 15 { // break // } if lfsr == startState { break } } println(period) }