import cmath

def qft_matrix(size, normalized=True):
    if type(size) is not int or size < 2 or size & (size - 1):
        raise ValueError("QFT fixture requires a power-of-two size")
    scale = size ** 0.5 if normalized else 1.0
    return [[cmath.exp(2j * cmath.pi * row * column / size) / scale
             for column in range(size)] for row in range(size)]

def unitarity_error(matrix):
    size = len(matrix)
    return max(abs(sum(matrix[row][a].conjugate() * matrix[row][b] for row in range(size))
                   - (1.0 if a == b else 0.0))
               for a in range(size) for b in range(size))

four_point = qft_matrix(4)
eight_point = qft_matrix(8)
unnormalized = qft_matrix(4, False)
four_error = unitarity_error(four_point)
eight_error = unitarity_error(eight_point)
mutant_error = unitarity_error(unnormalized)
invalid_rejected = False
try:
    qft_matrix(6)
except ValueError:
    invalid_rejected = True
assert four_error < 1e-12 and eight_error < 1e-12
assert mutant_error > 1.0 and invalid_rejected
print(f"PASS: 31 QFT unitary_error_N4={four_error:.3g} N8={eight_error:.3g} unnormalized_error={mutant_error:.1f}")
