Prob #1 Encode113G := proc(x1) local x,n,a,b,c,d,eq1,eq2,eq3,eq4,i,S: if(nops(x1) < 5 or nops(x1) > q-5 or q < 11) then print("t=4 and 2t+1 <= n <= q-1"): RETURN(FAIL): fi: x:=[op(x1),a,b,c,d]: n:=nops(x): eq1 := 0 = add(x[i], i=1..n): eq2 := 0 = add(i * x[i], i=1..n): eq3 := 0 = add(i^2 * x[i], i=1..n): eq4 := 0 = add(i^3 * x[i], i=1..n): S := msolve({eq1,eq2,eq3,eq4}, q): subs(S, [op(x1), a,b,c,d]): end: Sy113G:=proc(x,q) local i,r: [seq(add(x[i]*i^(r-1),i=1..nops(x)) mod q,r=1..4)]: end: Decode113G:=proc(y,q) local S,eq,i,j,L,i1,a,b: S:=Sy113G(y,q): if S=[0$4] then RETURN(y): fi: eq:=(S[2]^2-S[1]*S[3])*i^2+(S[1]*S[4]-S[2]*S[3])*i+ (S[3]^2-S[2]*S[4]) mod q: if eq=0 then i:=S[2]/S[1] mod q: a:=S[1]: RETURN(y-[0$(i-1),a,0$(nops(y)-i)] mod q): fi: #L is the list of roots of eq (mod q) L:=[]: for i1 from 0 to q-1 do if subs(i=i1,eq) mod q=0 then L:=[op(L),i1]: fi: od: i:=L[1]: j:=L[2]: b:=(i*S[1]-S[2])/(i-j) mod q: a:=S[1]-b mod q: y-[0$(i-1),a,0$(j-i-1),b,0$(nops(y)-j)] mod q: end: #Test code q:=11: x:=RV(q,6); x1:=Encode113G(x,q); x := [2, 5, 5, 6, 0, 3] x1 := [2, 5, 5, 6, 0, 3, 4, 3, 6, 10] p:=rand(1..nops(x1)): p1:=p(): e1:=[0$p1-1,1,0$nops(x1)-p1]: while((p2:=p())=p1)do:od: p2: e2:=[0$p2-1,1,0$nops(x1)-p2]: e:=e1+e2; y:=x1+e1+e2 mod q; S:=Sy113G(y,q); e := [0, 1, 0, 0, 0, 0, 0, 1, 0, 0] y := [2, 6, 5, 6, 0, 3, 4, 4, 6, 10] S := [2, 10, 2, 3] Decode113G(y,q); evalb(%=x1); [2, 5, 5, 6, 0, 3, 4, 3, 6, 10] true q:=13: x:=RV(q,5); x1:=Encode113G(x,q); x := [1, 1, 3, 0, 12] x1 := [1, 1, 3, 0, 12, 9, 2, 5, 6] p:=rand(1..nops(x1)): p1:=p(): e1:=[0$p1-1,1,0$nops(x1)-p1]: while((p2:=p())=p1)do:od: p2: e2:=[0$p2-1,1,0$nops(x1)-p2]: e:=e1+e2; y:=x1+e1+e2 mod q; S:=Sy113G(y,q); e := [0, 1, 0, 0, 1, 0, 0, 0, 0] y := [1, 2, 3, 0, 0, 9, 2, 5, 6] S := [2, 7, 3, 3] Decode113G(y,q); evalb(%=x1); [1, 1, 3, 0, 12, 9, 2, 5, 6] true q:=13: x:=RV(q,9); x1:=Encode113G(x,q); x := [5, 9, 4, 4, 0, 12, 1, 7, 9] "t=4 and 2t+1 <= n <= q-1" x1 := FAIL q:=17: x:=RV(q,9); x1:=Encode113G(x,q); x := [1, 4, 0, 2, 1, 1, 11, 3, 3] x1 := [1, 4, 0, 2, 1, 1, 11, 3, 3, 10, 13, 0, 2] p:=rand(1..nops(x1)): p1:=p(): e1:=[0$p1-1,1,0$nops(x1)-p1]: while((p2:=p())=p1)do:od: p2: e2:=[0$p2-1,1,0$nops(x1)-p2]: e:=e1+e2; y:=x1+e1+e2 mod q; S:=Sy113G(y,q); e := [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0] y := [1, 4, 0, 2, 2, 1, 11, 3, 3, 10, 14, 0, 2] S := [2, 16, 10, 11] Decode113G(y,q); evalb(%=x1); [1, 4, 0, 2, 1, 1, 11, 3, 3, 10, 13, 0, 2] true