import cmath, math
def mm(A,B): return [[sum(A[i][k]*B[k][j] for k in range(2)) for j in range(2)] for i in range(2)]
I=((1+0j,0j),(0j,1+0j)); X=((0j,1+0j),(1+0j,0j)); Z=((1+0j,0j),(0j,-1+0j))
def exp_pauli(P,t): return [[math.cos(t)*I[i][j]-1j*math.sin(t)*P[i][j] for j in range(2)] for i in range(2)]
def trotter(n):
    if type(n) is not int or n <= 0: raise ValueError("step count must be positive")
    step=mm(exp_pauli(X,1/n),exp_pauli(Z,0.3/n)); out=[list(r) for r in I]
    for _ in range(n): out=mm(step,out)
    return out
def delta(A,B): return sum(abs(A[i][j]-B[i][j])**2 for i in range(2) for j in range(2))**0.5
r=math.sqrt(1.09); exact=[[math.cos(r)*I[i][j]-1j*math.sin(r)*(X[i][j]+0.3*Z[i][j])/r for j in range(2)] for i in range(2)]
errors=[delta(trotter(n),exact) for n in (1,2,4)]
invalid_rejected=False
try: trotter(0)
except ValueError: invalid_rejected=True
assert errors[2] < errors[1] < errors[0]
assert invalid_rejected
print(f"PASS: 34 Hamiltonian simulation Trotter_errors={[round(value, 6) for value in errors]} invalid_steps={invalid_rejected}")
