| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import itertools
- q = 11
- n = 10
- k = 4
- d = n - k + 1
- K = GF(q)
- R.<x> = K[]
- α = K(2)
- assert set(α^i for i in range(q - 1)) | {0} == set(K)
- # Pick a random codeword
- m = (3, 0, 7, 9)
- f = m[0] + m[1]*x + m[2]*x^2 + m[3]*x^3
- print(f"m = {m}")
- c = vector(f(α^i) for i in range(q - 1))
- assert len(c) == q - 1
- print(f"c = {c}")
- e = int((n - k)/2)
- assert e == 3
- # We can tolerate <= (n-k)/2 = 3 errors
- c[2] = 0
- c[4] = 6
- c[7] = 7
- # Naive and very slow
- freqs = {}
- for (i0, i1, i2, i3) in itertools.permutations(range(n), int(4)):
- g = R.lagrange_polynomial([
- (α^i0, c[i0]),
- (α^i1, c[i1]),
- (α^i2, c[i2]),
- (α^i3, c[i3]),
- ])
- if not g in freqs:
- freqs[g] = 0
- freqs[g] += 1
- max_key = max(freqs.keys(), key=lambda k: freqs[k])
- assert max_key == f
- E0 = (x - α^2)*(x - α^4)*(x - α^7)
- assert E0.degree() <= n - k - 1
- N0 = E0*f
- print(f"E = {E0}")
- print(f"N = {N0}")
- S = []
- for i in range(n):
- row = []
- αi = α^i
- # deg N = e + (k - 1)
- for j in range(e + k):
- row.append(αi^j)
- r_i = c[i]
- # deg E = e
- # We don't need x^e here
- for j in range(e):
- row.append(-r_i * αi^j)
- assert n == 2*e + k
- assert len(row) == n
- S.append(row)
- assert len(S) == n
- A = matrix(S)
- s = vector(r * α^(i*e) for (i, r) in enumerate(c))
- print(f"s = {s}")
- v = A.solve_right(s)
- print(f"A = {A}")
- print(f"v = {v}")
- Nv, Ev = v[:e + k], v[e + k:]
- print(Nv)
- print(Ev)
- N = sum(Ni * x^i for (i, Ni) in enumerate(Nv))
- E = sum(Ei * x^i for (i, Ei) in enumerate(Ev)) + x^e
- print(f"N = {N}")
- print(f"E = {E}")
- assert N == N0
- assert E == E0
- f, rem = N.quo_rem(E)
- assert rem == 0
- print(f"f = {f} =", list(f))
|