#hw8, Isaac Lam, February 15 2024 #Old code # returns matrix M in standard form SFde:=proc(q,M) local k,n,i,j,S,rj,cj,ri: k:=nops(M); n:=nops(M[1]); S:=copy(M); for i from 1 to k do: # algorithm is iterated from 1 to k # if S_ii = 0, then we need to perform a swap: if S[i,i] = 0 then for j from i+1 to k while S[j,i] = 0 do od; # look for available row if j<=k then # swap rows rj:=GetRow(S,j); S:=SetRow(S,j, GetRow(S,i)); S:=SetRow(S,i,rj); else # look to swap columns for j from i+1 to n while S[i,j] = 0 do od; # look for available col # swap cols cj:=GetCol(S,j); S:=SetCol(S,j, GetCol(S,i)); S:=SetCol(S,i,cj); fi; fi; # scale row to have leading entry 1 ri:=GetRow(S,i); ri:=(ri*(ri[i]&^(-1) mod q)) mod q; S:=SetRow(S,i,ri); for j from 1 to k do: if j <> i then rj:=GetRow(S,j); rj:=(rj - (rj[i] * ri mod q)) mod q; S:=SetRow(S,j,rj); fi; od; od; return S; end; #End of old code with(NumberTheory); with(LinearAlgebra[Modular]); WtEnumerator := proc(q, M, t) local totalWeight, currWeight, currVector, alph, i, j, currNum, currLinCombo, sF; alph := [0, 1]; sF := SFde(q, M); for i to t do if nops(PrimeFactors(i)) = 1 then alph := [op(alph), i]; end if; end do; for i from 0 to nops(sF)*nops(alph) do currLinCombo := convert(i, 'base', nops(alph)); currVector := seq(0, i = 1 .. q); for j from nops(sF) - nops(currLinCombo) + 1 to nops(sF) do currVector := Mod(t, currVector + sF[j]*alph[currLinCombo[j + nops(currLinCombo) - nops(sF) - 1]]); end do; currWeight := 0; for j to q do if currVector[j] <> 0 then currWeight := currWeight + 1; end if; end do; totalWeight := totalWeight + t^currWeight; end do; totalWeight; end;