"""Original exact power iteration; residual verifies eigenpair, not dominance."""
from fractions import Fraction as F
import json

def run(a,start,cap=8,tol=F(1,10**8)):
 if type(a) is not list or not 1<=len(a)<=3 or any(type(r) is not list or len(r)!=len(a) for r in a) or any(type(x) not in [int,F] or abs(x)>100 for row in a for x in row) or type(start) is not list or len(start)!=len(a) or any(type(x) not in [int,F] or abs(x)>100 for x in start) or not any(start) or type(cap) is not int or not 1<=cap<=16 or type(tol) not in [int,F] or tol<=0:raise ValueError('bounded exact matrix/vector, nonzero start, valid cap/tolerance')
 a=[list(map(F,r)) for r in a];x=list(map(F,start));scale=max(map(abs,x));x=[v/scale for v in x];rows=[]
 for k in range(cap):
  y=[sum(a[i][j]*x[j] for j in range(len(x))) for i in range(len(x))];s=max(map(abs,y))
  if not s:return rows,'zero_image'
  v=[z/s for z in y];av=[sum(a[i][j]*v[j] for j in range(len(v))) for i in range(len(v))];rq=sum(v[i]*av[i] for i in range(len(v)))/sum(z*z for z in v);res=max(abs(av[i]-rq*v[i]) for i in range(len(v)))
  rows.append({'step':k+1,'normalized_vector':[str(z) for z in v],'nonnegative_normalization_scale':str(s),'signed_Rayleigh':str(rq),'residual_infinity':str(res)});x=v
  if res<=tol:return rows,'eigenpair_residual_tolerance_not_dominance_proof'
 return rows,'budget_exhausted'

def demo():
 rows,status=run([[-3,0],[0,1]],[1,1]);assert status=='budget_exhausted'
 for k,row in enumerate(rows,1):
  raw=[F((-3)**k),F(1)];m=max(map(abs,raw));assert row['normalized_vector']==[str(v/m) for v in raw] and F(row['nonnegative_normalization_scale'])==3
 absent,abs_status=run([[-3,0],[0,1]],[0,1]);assert F(absent[-1]['signed_Rayleigh'])==1 and abs_status=='eigenpair_residual_tolerance_not_dominance_proof'
 equal,eqstatus=run([[1,0],[0,-1]],[1,1],4);assert eqstatus=='budget_exhausted' and equal[0]['normalized_vector']==equal[2]['normalized_vector']!=equal[1]['normalized_vector']
 zero,zstatus=run([[0,0],[0,0]],[1,1]);assert zstatus=='zero_image'
 rejected=[]
 for label,fn in [('zero_start',lambda:run([[1,0],[0,2]],[0,0])),('ragged',lambda:run([[1,2]],[1])),('nonfinite',lambda:run([[float('nan')]],[1])),('cap_bool',lambda:run([[1]],[1],True)),('tol_zero',lambda:run([[1]],[1],tol=0))]:
  try:fn()
  except ValueError:rejected.append(label)
  else:raise AssertionError('expected rejection')
 return {'authored_diagonal_matrix':[[-3,0],[0,1]],'start':[1,1],'eight_exact_steps':rows,'status':status,'known_dominant_eigenvalue':-3,'normalization_scale_is_not_signed_eigenvalue':True,'closed_form_power_oracle':'[(-3)^k,1] normalized by infinity norm, checked every step','missing_dominant_start_component':{'start':[0,1],'steps':absent,'status':abs_status},'equal_absolute_eigenvalues':{'matrix':[[1,0],[0,-1]],'steps':equal,'status':eqstatus},'zero_image_status':zstatus,'invalid_cases_rejected':rejected,'scope':'no universal convergence, PCA/model training/benchmark; norm ratio positive3 differs from negative dominant eigenvalue;8steps do not pass chosen1e-8residual tolerance'}
if __name__=='__main__':print(json.dumps(demo(),ensure_ascii=True,indent=2))
