Picard–Lefschetz Theory and Lorentzian Contours
Scrollable formula. Use Left and Right arrow keys to reveal hidden content.
Scrollable table. Use Left and Right arrow keys to reveal additional columns.
Scrollable figure. Use Left and Right arrow keys to inspect hidden content.
Picard–Lefschetz theory answers a question that stationary-phase reasoning alone cannot: which complex saddles are continuously connected to the original Lorentzian integration cycle? The answer is encoded by steepest-descent thimbles and integer intersection numbers. This page develops that geometry and validates its orientation, Jacobian, branch, and convergence logic on a regulated oscillatory Gaussian. The executable benchmark is a method check, not a computation of the gravitational path integral.
Required background. Gravitational Actions and Boundary Terms supplies the action and endpoint data; Flat-Spacetime Quantum Field Theory supplies complex Gaussian integrals and saddle expansions.
Helpful background. Einstein Equations supplies gravitational saddles; Quantum Information supplies amplitude and state distinctions; and Quantum Gravity supplies the evidence boundaries for finite models.
Complex saddles and thimbles
Section titled “Complex saddles and thimbles”For a finite-dimensional Lorentzian integral
complexify and study the Morse function . A downward flow can be written
Along it, decreases while is constant. The downward thimble consists of trajectories that approach the critical point as and flow toward smaller as increases. It is therefore the unstable manifold of the displayed forward flow. The dual upward cycle is defined by the reversed flow and is the corresponding stable manifold. Under suitable decay and nondegeneracy conditions,
A saddle contributes only if . Witten gives the relative-homology construction and the flow geometry in Witten 2010, §§2–3. At a Stokes transition, upward flows connect critical points and the individual can jump; the complete contour class remains unchanged.
In gravity the variable may be a lapse, scale factor, or complex metric. Singular lapse endpoints, gauge zero modes, and branch points must be included before the intersection problem is meaningful. Feldbrugge, Lehners, and Turok apply the construction to a specified Lorentzian minisuperspace lapse contour in Feldbrugge, Lehners, and Turok 2017, §§II–IV.
Exact regulated Gaussian
Section titled “Exact regulated Gaussian”Use the convergent integral
with the principal square root. Let and . On , and , so this ray is the exact steepest-descent thimble with the inherited orientation. The original real contour and the rotated contour must converge to the same analytic value before taking .
This control exposes four common errors. Omitting loses the contour Jacobian. Reversing the orientation changes the sign. Choosing the other square-root branch changes the sign of the exact result. Truncating the real contour too early leaves an oscillatory tail that can look stable at one resolution.
Complete CPython reference program
Section titled “Complete CPython reference program”The program supports CPython 3.11 or later and was rerun with CPython 3.12.14, using only the Python standard library and no third-party package. Inputs are and three refinements:
Composite Simpson integration uses deterministic binary64 complex arithmetic. Final tolerances are for the real-contour error and contour mismatch and for the thimble error.
Save the following program as picard_lefschetz_gaussian.py. The script writes the semantic refinement table, checks monotone real-contour improvement, detects the omitted Jacobian, reversed orientation, and wrong branch, and exits nonzero on failure.
import cmathimport mathimport platformimport sys
EPSILONS = (0.2, 0.1, 0.05)LEVELS = ((12.0, 2400), (18.0, 4800), (24.0, 9600))REAL_TOL = 1.0e-6THIMBLE_TOL = 1.0e-10
def simpson(function, left, right, panels): if panels <= 0 or panels % 2: raise ValueError("Simpson panels must be positive and even") step = (right - left) / panels total = function(left) + function(right) for index in range(1, panels): weight = 4 if index % 2 else 2 total += weight * function(left + index * step) return total * step / 3
def evaluate(epsilon, radius, panels): coefficient = complex(epsilon, -1.0) exact = cmath.sqrt(2.0 * math.pi / coefficient) real_value = simpson( lambda x: cmath.exp(-0.5 * coefficient * x * x), -radius, radius, panels, ) angle = -0.5 * cmath.phase(coefficient) jacobian = cmath.exp(1j * angle) thimble_value = simpson( lambda y: jacobian * cmath.exp(-0.5 * coefficient * (jacobian * y) ** 2), -radius, radius, panels, ) no_jacobian = thimble_value / jacobian return { "exact": exact, "real": real_value, "thimble": thimble_value, "no_jacobian": no_jacobian, }
def stop(message): raise SystemExit("FAIL: " + message)
def main(): if sys.implementation.name != "cpython" or sys.version_info[:2] < (3, 11): stop("requires CPython 3.11 or later; found " + platform.python_version())
rows = [] previous_real_error = math.inf final_results = None for radius, panels in LEVELS: results = [evaluate(epsilon, radius, panels) for epsilon in EPSILONS] real_error = max(abs(item["real"] - item["exact"]) for item in results) thimble_error = max( abs(item["thimble"] - item["exact"]) for item in results ) contour_gap = max( abs(item["real"] - item["thimble"]) for item in results ) if real_error >= previous_real_error: stop("real-contour refinement is not monotone") previous_real_error = real_error rows.append((radius, panels, real_error, thimble_error, contour_gap)) final_results = results
final_real = rows[-1][2] final_thimble = rows[-1][3] final_gap = rows[-1][4] if final_real > REAL_TOL or final_gap > REAL_TOL: stop("final real-contour or cross-contour tolerance failed") if final_thimble > THIMBLE_TOL: stop("final thimble tolerance failed")
for item in final_results: exact = item["exact"] if abs(item["no_jacobian"] - exact) < 0.5: stop("omitted-Jacobian control was not detected") if abs(-item["thimble"] - exact) < 1.0: stop("reversed-orientation control was not detected") if abs(-exact - exact) < 1.0: stop("wrong-square-root-branch control was not detected")
print("CPython", platform.python_version(), "standard-library-only") print("L N max_real_error max_thimble_error max_contour_gap") for row in rows: print(f"{row[0]:.0f} {row[1]} {row[2]:.6e} {row[3]:.6e} {row[4]:.6e}") print("PASS: principal branch, orientation, Jacobian, and tolerances")
if __name__ == "__main__": main()Use this exact save-and-run recipe; the final line is the clean rerun command.
python3 --versionpython3 -m py_compile picard_lefschetz_gaussian.pypython3 picard_lefschetz_gaussian.pyThe source above was compiled and run with CPython 3.12.14 during the 2026-09-27 check. It printed the three rows below followed by PASS: principal branch, orientation, Jacobian, and tolerances; no package beyond that interpreter’s standard library was used. The values agree with the earlier 2026-08-20 calculation on CPython 3.11.3.
Static convergence output
Section titled “Static convergence output”The numerical kernel gives the following three-level target. Errors are maxima over the three regulator values; the slowest real-contour convergence occurs at because its damping tail is longest.
| Refinement | Maximum real-contour error | Maximum thimble error | Maximum contour difference | ||
|---|---|---|---|---|---|
| Coarse | 12 | 2400 | |||
| Medium | 18 | 4800 | |||
| Fine | 24 | 9600 |
For at the fine level, the real-contour value is approximately , while both the thimble and exact values are approximately . The table demonstrates tail and quadrature control for this Gaussian only.
Interpretation and gravitational limitations
Section titled “Interpretation and gravitational limitations”In a minisuperspace lapse integral, one would locate complex saddles, integrate upward flows to determine , and refine the original contour and regulator. Stokes transitions require tracking the sum rather than an isolated saddle. Lehners explains how these choices enter competing cosmological prescriptions Lehners 2023, §3.6 and Appendix C.
The Gaussian has one entire action, one critical point, no gauge zero mode, and no singular endpoint. Full gravity has infinitely many modes, a diffeomorphism quotient, conformal directions, boundary terms, and possible topology change. Passing this benchmark validates the implementation of a rotated contour; it supplies no evidence that a proposed gravitational contour is unique or physically correct.
Exercises
Section titled “Exercises”The thimble error is already near roundoff at the coarse level, while the real-contour error falls by roughly five orders of magnitude. Which refinement controls each error, and why would comparing only the two finest thimble values be a misleading convergence test?
Solution
On the rotated contour the exponent is a decaying real Gaussian, so already suppresses the tail and Simpson error to binary64 roundoff. Further refinement cannot decrease that error monotonically because rounding dominates. The real contour retains an oscillatory tail damped only by , so increasing both and reduces truncation and discretization error from to . Comparing only thimble levels would show a noisy roundoff plateau and miss whether the deformed contour agrees with the original cycle. The exact value and real–thimble difference are the necessary independent controls.
References
Section titled “References”- Feldbrugge, Job, Jean-Luc Lehners, and Neil Turok. “Lorentzian Quantum Cosmology.” Physical Review D 95 (2017): 103508. DOI.
- Lehners, Jean-Luc. “Review of the No-Boundary Wave Function.” Physics Reports 1022 (2023): 1–82. arXiv:2303.08802.
- Witten, Edward. “Analytic Continuation of Chern–Simons Theory.” AMS/IP Studies in Advanced Mathematics 50 (2011): 347–446. arXiv:1001.2933.