"""Check the nonzero-eigenfunction condition for numberdb.org/T488.

Run with SageMath: sage -python check_definition.py
This checks the reported definition omission exactly. It neither computes
nor modifies spectral data. The positive control checks the derivatives.
"""
import json
import numberdb.sage
from sage.rings.rational_field import QQ
from sage.rings.polynomial.polynomial_ring_constructor import PolynomialRing
from sage.version import version

ring = PolynomialRing(QQ, names=('x', 'y', 'lam', 'nu_x', 'nu_y'))
x, y, lam, nu_x, nu_y = ring.gens()

def laplacian(u):
    return u.derivative(x, 2) + u.derivative(y, 2)

def normal_derivative(u):
    return nu_x * u.derivative(x) + nu_y * u.derivative(y)

control = x**4 + y**4
assert laplacian(laplacian(control)) == 48
assert normal_derivative(x + 2*y) == nu_x + 2*nu_y
u = ring.zero()
assert laplacian(laplacian(u)) - lam*u == 0
assert u == 0
assert normal_derivative(u) == 0
print(json.dumps({
    'sage_version': version,
    'control_bilaplacian_x4_plus_y4': '48',
    'control_normal_derivative_x_plus_2y': 'nu_x + 2*nu_y',
    'zero_solution_pde_residual': '0 for arbitrary lam',
    'zero_solution_boundary_value': '0',
    'zero_solution_normal_derivative': '0 for arbitrary normal',
    'conclusion': 'The zero function satisfies the homogeneous equations for every lam; the definition of an eigenvalue requires a nonzero solution.',
    'spectral_values_recomputed': False,
}, indent=2))
