wick v2: overlay (pencil of spheres sweeping S³) and the lamp's ball for the gamma factor (3:23)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FAqjv3n4yABxvJPJHFRhVA
This commit is contained in:
1 parent
f9fa4b8bfd
commit
a8ddd96ef0
5 files changed
+75
-14
No files matched your search
@@ -1 +1 @@
|
||||
[19.2, 15.2, 24.48, 26.88, 18.96, 22.8, 22.96]
|
||||
[19.2, 15.2, 24.48, 26.88, 18.96, 22.8, 28.64, 41.76]
|
||||
@@ -5,5 +5,6 @@
|
||||
"Keep turning. At the half turn it is a sphere again, but inside out: every point has gone to its opposite. At three quarters, a plane again, facing the other way. At the full turn, home. Four quarter turns: sphere, plane, sphere, plane, sphere. That is the Wick cycle.",
|
||||
"A plane is a chart: a picture of the sphere with one point missing. The sphere is the whole thing. So passing from the plane phase to the sphere phase means putting the missing point back: making an affine picture projective. That is exactly what analytic continuation does.",
|
||||
"Now draw latitude and longitude on the sphere about the j axis, and go to the plane phase. The grid becomes circles nested around minus one and one, with arcs swinging between them. Shrink it by a half and slide it by a half, and that is the picture zeta draws: poles on zero and one, the equator on the critical line.",
|
||||
"One more piece. Zeta's far hemisphere is not quite the mirror of the near one. It is the mirror, dressed by a gamma factor. Fold that factor in and you get xi, which lives on the sphere cleanly, with the half turn as its symmetry. Sphere to plane is continuation. The gamma factor is the fare for the trip."
|
||||
]
|
||||
"Now overlay every turn at once. Each position of the sphere passes through the same circle, the j k circle, so the whole family is a pencil of spheres threaded on one ring, with their centres sliding along the i axis. The plane is just the member that reaches infinity. Sweep theta all the way round and the pencil fills space: the four snapshots were slices of the hypersphere, and the ring and the axis are its two linked threads.",
|
||||
"One more piece: the gamma factor. Every prime gives zeta a ball of its own, wrapping at its own rate, log p. They are the harmonics. There is one more place, infinity, the lamp, and its ball has no period: it is the single continuous source the harmonics are sampled from. Its factor is the gamma function. Fold it in and you get xi, which lives on the sphere cleanly, with the half turn as its symmetry: the far side of the equator is the alias of the near side, folded at the Nyquist line, one half. Sphere to plane is continuation. The gamma factor is the lamp's own ball."
|
||||
]
|
||||
@@ -0,0 +1,13 @@
|
||||
import json, numpy as np, pathlib, pocket_tts
|
||||
from pocket_tts import TTSModel
|
||||
S = json.load(open('script.json'))
|
||||
m = TTSModel.load_model(config=str(pathlib.Path(pocket_tts.__file__).parent / 'config' / 'english_2026-01.yaml'))
|
||||
st = m.get_state_for_audio_prompt('azelma')
|
||||
D = json.load(open('durations.json'))[:6]
|
||||
for i in (6, 7):
|
||||
parts = [(s.detach().cpu().numpy().clip(-1, 1) * 32767).astype('<i2') for s in m.generate_audio_stream(st, S[i], copy_state=True)]
|
||||
a = np.concatenate(parts); open(f'seg_{i}.pcm', 'wb').write(a.tobytes()); D.append(round(len(a)/24000, 3)); print(i, D[-1], flush=True)
|
||||
json.dump(D, open('durations.json', 'w'))
|
||||
gap = np.zeros(int(0.6*24000), dtype='<i2').tobytes()
|
||||
full = b''.join(open(f'seg_{k}.pcm','rb').read() + (gap if k < len(D)-1 else b'') for k in range(len(D)))
|
||||
open('wick.pcm','wb').write(full); print('total', len(full)/48000)
|
||||
+58
-11
@@ -163,19 +163,66 @@ class W5(Q):
|
||||
self.label("halve and slide by ½: zeta's grid, poles on 0 and 1, equator on the critical line")
|
||||
self.rest()
|
||||
|
||||
# ---------- W6: the gamma factor
|
||||
# ---------- W6: the overlay — a pencil of spheres on one ring, sweeping out S^3
|
||||
class W6(Q):
|
||||
def construct(self):
|
||||
self.setup_time(6); self.cam(66, -38, 0.9)
|
||||
self.setup_time(6); self.cam(64, -38, 0.85)
|
||||
ax = self.axes(); self.add(ax)
|
||||
tr = ValueTracker(0.0); g = grid(one_sided, tr); self.add(g)
|
||||
self.begin_ambient_camera_rotation(rate=0.05)
|
||||
t1 = Text("ζ: far hemisphere = mirror of the near one × Γ-factor", font="Georgia", color=FG).scale(0.5).to_edge(UP, buff=0.5); self.add_fixed_in_frame_mobjects(t1)
|
||||
self.go(FadeIn(t1), rt=1.0)
|
||||
self.go(Wait(), rt=4.0)
|
||||
t2 = Text("ξ = ζ dressed with the Γ-factor: ξ(s) = ξ(1 − s)", font="Georgia", color=GOLD).scale(0.5).next_to(t1, DOWN, buff=0.15); self.add_fixed_in_frame_mobjects(t2)
|
||||
self.go(FadeIn(t2), rt=1.0)
|
||||
# the jk ring (shared by every member) and the i axis (the centres' track)
|
||||
ring = ParametricFunction(lambda t: S*np.array([0, np.cos(t), np.sin(t)]), t_range=[0, TAU, TAU/120], color=GOLD, stroke_width=4)
|
||||
iax = Line3D(-S*4*RIGHT, S*4*RIGHT, color=PINK, thickness=0.012)
|
||||
self.add(ring)
|
||||
# static members of the pencil
|
||||
members = VGroup()
|
||||
for k, th in enumerate([0, PI/6, PI/3, PI/2, 2*PI/3, 5*PI/6]):
|
||||
tr = ValueTracker(th); g = grid(one_sided, tr, lats=5, lons=4)
|
||||
for m in g: m.clear_updaters()
|
||||
g.set_stroke(opacity=0.55 if k in (0, 3) else 0.28)
|
||||
members.add(g)
|
||||
self.go(LaggedStart(*[FadeIn(m) for m in members], lag_ratio=0.3), rt=4.0)
|
||||
self.go(FadeIn(iax), rt=0.8)
|
||||
c = self.label("a pencil of spheres on one ring; the plane is the member through ∞")
|
||||
self.go(Wait(), rt=3.0)
|
||||
self.go(tr.animate.set_value(PI), rt=4.0, rate_func=smooth)
|
||||
self.label("sphere to plane is continuation; the gamma factor is the fare")
|
||||
tr = ValueTracker(0.0); live = grid(one_sided, tr, lats=5, lons=4); self.add(live)
|
||||
self.dial(tr)
|
||||
self.go(tr.animate.set_value(TAU), rt=8.0, rate_func=linear)
|
||||
self.go(FadeOut(c), rt=0.1); self.label("the full circle fills space: the hypersphere, with the ring and the axis as its two linked threads")
|
||||
self.begin_ambient_camera_rotation(rate=0.05)
|
||||
self.rest()
|
||||
|
||||
# ---------- W7: the gamma factor as the lamp's own ball
|
||||
class W7(Timed, Scene):
|
||||
def construct(self):
|
||||
self.setup_time(7)
|
||||
# prime balls along the bottom, each wrapping at rate log p; the lamp ball above with no period
|
||||
primes = [2, 3, 5, 7]
|
||||
balls = VGroup()
|
||||
for n, p in enumerate(primes):
|
||||
c = Circle(radius=0.55, color=GREY, stroke_width=2).move_to(np.array([-3.6 + 2.4*n, -1.6, 0]))
|
||||
lab = Text(str(p), font="Georgia", color=TEAL).scale(0.55).next_to(c, DOWN, buff=0.15)
|
||||
balls.add(VGroup(c, lab))
|
||||
self.go(LaggedStart(*[FadeIn(b) for b in balls], lag_ratio=0.3), rt=2.0)
|
||||
tr = ValueTracker(0.0)
|
||||
hands = VGroup(*[always_redraw(lambda b=b, p=p: Line(b[0].get_center(), b[0].get_center() + 0.55*np.array([np.cos(np.log(p)*tr.get_value()), np.sin(np.log(p)*tr.get_value()), 0]), color=WARM, stroke_width=3)) for b, p in zip(balls, primes)])
|
||||
self.add(hands)
|
||||
t1 = Text("every prime: a ball wrapping at rate log p — the harmonics", font="Georgia", color=MUTED).scale(0.48).to_edge(DOWN, buff=0.4)
|
||||
self.add(t1)
|
||||
self.go(tr.animate.set_value(6.0), rt=5.0, rate_func=linear)
|
||||
lamp = Circle(radius=1.0, color=GOLD, stroke_width=3).move_to(np.array([-2.2, 1.6, 0]))
|
||||
glow = Circle(radius=1.12, color=GOLD, stroke_width=10, stroke_opacity=0.15).move_to(lamp.get_center())
|
||||
linf = Text("∞", font="Georgia", color=FG).scale(0.8).move_to(lamp.get_center())
|
||||
lg = Text("π^(−s/2) Γ(s/2) — the lamp's ball, no period", font="Georgia", color=GOLD).scale(0.48).next_to(lamp, RIGHT, buff=0.4)
|
||||
self.go(FadeIn(glow), Create(lamp), FadeIn(linf), rt=1.6); self.go(Write(lg), rt=1.2)
|
||||
self.go(tr.animate.set_value(10.0), rt=3.0, rate_func=linear)
|
||||
self.go(FadeOut(t1), rt=0.2)
|
||||
t2 = Text("ξ = the lamp's ball × every prime's ball", font="Georgia", color=FG).scale(0.55).to_edge(DOWN, buff=0.95)
|
||||
t3 = Text("far side of the equator = alias of the near side, folded at the Nyquist line ½", font="Georgia", color=MUTED).scale(0.45).to_edge(DOWN, buff=0.4)
|
||||
self.go(FadeIn(t2), rt=0.8); self.go(FadeIn(t3), rt=0.8)
|
||||
# the fold: a short strip with the Nyquist line and mirrored arrows
|
||||
ln = Line(np.array([0, -0.3, 0]), np.array([0, 0.3, 0]), color=GOLD, stroke_width=3).shift(2.1*DOWN*0 + 0.0*RIGHT).move_to(np.array([0, -0.2, 0]))
|
||||
a1 = Arrow(np.array([-1.6, -0.2, 0]), np.array([-0.15, -0.2, 0]), color=COOL, buff=0, stroke_width=3)
|
||||
a2 = Arrow(np.array([1.6, -0.2, 0]), np.array([0.15, -0.2, 0]), color=WARM, buff=0, stroke_width=3)
|
||||
nl = Text("½", font="Georgia", color=GOLD).scale(0.5).next_to(ln, UP, buff=0.08)
|
||||
self.go(Create(ln), FadeIn(nl), GrowArrow(a1), GrowArrow(a2), rt=1.4)
|
||||
self.go(tr.animate.set_value(16.0), rt=4.0, rate_func=linear)
|
||||
self.rest()
|
||||
Reference in new issue
Block a user