import numpy as np
from sympy import Matrix
from random import randint
from flag import FLAG

m, a, c, seed = 0x8000000b, *map(lambda x: int(x, 16), open("values.txt", "r").readlines())

def lcg(m: int, a: int, c: int, seed: int) -> list[int]:
    k = []
    x = seed
    for _ in range(len(FLAG)):
        x = (a * x + c) % (m)
        k.append(x)
    
    return k

v = np.eye(len(FLAG), dtype=np.uint32) * np.array(bytearray(FLAG), dtype=np.uint32).T
lcgseq = lcg(m, a, c, seed)

for e, X in enumerate(lcgseq):
    v[e, e] = X ^ v[e, e]

with open("output.txt", "w") as f:
    chi = Matrix(v).charpoly()
    for _ in range(500):
        r = randint(0x1337, 0xdeadbeef)
        f.write( hex(r) + ', ' + hex(chi(r)) + '\n' )

    f.write(f"{ {lcgseq.index(i):sorted(lcgseq).index(i) for i in lcgseq} }")