with(linalg): letter := proc(n) local alph, i, ans; alph := `ABCDEFGHIJKLMNOPQRSTUVWXYZ`; i := (n - 1 mod 26) + 1; ans := substring(alph,i..i); RETURN(ans); end: numbers := proc(s) local alph, v, n, m, i, c; alph:=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`; n := length(s); v := []; for i from 1 to n do c := substring(s,i..i); m := searchtext(c, alph); if m > 0 then v := [op(v), (m-1 mod 26) + 1] fi; od; RETURN(v) end: numbers2 := proc(s) local alph, v, n, m, i, c; alph:=`abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`; n := length(s); v := []; for i from 1 to n do c := substring(s,i..i); m := searchtext(c, alph); if m > 0 then v := op(v), (m-1 mod 26) + 1 fi; od; RETURN(v) end: pvalues := proc(s) local alph, v, n, m, i, j, k, c, nby2, t; alph := `abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ`; n := length(s); t := s; if (n mod 2 = 0) then nby2 := iquo(n,2) else nby2 := iquo(n,2)+1 fi; v := array(1..2,1..nby2); if (n mod 2 = 1) then t := cat(s,`x`) fi; for i from 1 to nby2 do j := 2*i-1; k := j+1; c := substring(t,j..j); m := searchtext(c, alph); if m>0 then m:=(m-1 mod 26)+1 fi; v[1,i] := m; c := substring(t,k..k); m := searchtext(c, alph); if m>0 then m:=(m-1 mod 26)+1 fi; v[2,i] := m; od; RETURN(v); end: out := evalm(pvalues(`helloworld`)): C:=map(letter, out): clock26 := x -> ((x-1) mod 26) + 1: matmult := proc(decvec, key, keysize) local l1, l3, i, j, k, temp, temp2, temp3; temp2 := linalg[vector](keysize); temp := convert(decvec,array); l1 :=linalg[vectdim](temp); l3 := l1/keysize; for j from 0 to (l3 -1) do for i from 1 to keysize do temp2[i] := temp[j*keysize+i]: od; temp2 := map(clock26,linalg[multiply](key,temp2)): for i from 1 to keysize do temp[j*keysize + i] := temp2[i]: od: od; convert(temp,list); end: C:=matmult(numbers(`helloworld`),E,2): Cipher:=map(letter,C): d:=map(numbers2,Cipher): map(letter,d): invertmod:= A -> map(clock26, inverse(A)):