A complete, mathematically rigorous method for detecting and computing Puiseux series solutions (fractional exponent power series) of algebraic ordinary differential equations (AODEs). Developed during a research internship at CRIStAL (Centre de Recherche en Informatique, Signal et Automatique de Lille) under the supervision of François Boulier.
Report:
report/main.pdf— Full 15-page paper with proofs, algorithms, and examples.Preprint: The theoretical results are being prepared for submission.
Given a polynomial differential equation:
Does it admit a Puiseux series solution?
The Denef–Lipshitz algorithm (1984/1989) decides existence of formal power series (DifferentialAlgebra package. But when the answer is "no FPS", we need to investigate fractional-exponent series — Puiseux series.
We apply a monomial change of independent variable:
This transforms the original polynomial
The core insight:
$P$ admits a Puiseux series solution$\Longleftrightarrow$ there exists a pair$(a,b)$ such that$K_{a,b}$ admits a formal power series (FPS) solution — which is decidable by Denef–Lipshitz.
Before calling the costly Denef–Lipshitz elimination, we derive an arithmetic necessary condition on
This generalizes to multi-monomial
We prove that
Using the Newton differential polygon, we establish that
Any Puiseux solution accessible via an arbitrary algebraic change of variable
Puiseux series with poles are handled via the transformation docs/poles_puiseux.tex).
| Algorithm | Purpose | Complexity | Calls Denef–Lipshitz? |
|---|---|---|---|
fast_decision |
Yes/No/Maybe answer | No | |
full_solver |
Compute all Puiseux solutions | Dominated by DL | Only for passing |
fast_decision uses the congruence filter to classify equations into:
-
YES— definitely has a Puiseux solution (polynomial in$z'$ factorizes over $\mathbb{Q}(t)$) -
NO— definitely has no Puiseux solution (congruence condition fails for all$b$ ) -
LIKELY— congruence passes but factorization fails; needsfull_solver
puiseux-differential-algebra/
├── README.md # This file
├── LICENSE # MIT License
├── report/
│ ├── main.pdf # Full research paper (15 pages)
│ ├── main.tex # LaTeX source
│ └── chapters/*.tex # Individual chapters
├── src/
│ ├── __init__.py
│ ├── change_of_variable.py # x^a = t^b transformation
│ ├── compute_a.py # Determination of admissible a values
│ ├── utils.py # Symbolic utilities (min exponents, etc.)
│ ├── congruence_method.py # Simple congruence: (z')^m / c - t^{f(b)}
│ ├── multi_monomial.py # Generalized multi-monomial congruence
│ ├── theorem_with_z.py # Extension: K contains z (not just z')
│ ├── two_algorithms.py # fast_decision + full_solver
│ ├── puiseux_pipeline.py # Complete pipeline (end-to-end)
│ ├── puiseux_solver.py # Alternative solver (with z support)
│ ├── manual_denef_lipshitz.py # Manual DL for degenerate cases
│ └── resolve_likely.py # Factorization-based resolution
├── tests/
│ └── test_pipeline.py # Test suite (5 test cases)
├── docs/
│ ├── equivalence_theorem.tex # Proof that monomial changes are complete
│ ├── congruence_generalisee.tex # Generalized congruence theory
│ ├── changements_exotiques.tex # Non-monomial changes do not help
│ ├── borne_b_max.tex # Proof of b ≤ deg(P) bound
│ └── poles_puiseux.tex # Extension to Puiseux series with poles
└── examples/
└── basic_examples.py # Ready-to-run examples
- Python 3.11+
- SymPy — symbolic computation
- DifferentialAlgebra — the C extension by François Boulier implementing Rosenfeld-Gröbner and Denef–Lipshitz
# 1. Clone the repository
git clone https://github.com/AlexGit31/puiseux-differential-algebra.git
cd puiseux-differential-algebra
# 2. Install Python dependencies
pip install sympy
# 3. Install DifferentialAlgebra (C extension)
# Clone from: https://codeberg.org/francois.boulier/DifferentialAlgebra
cd DifferentialAlgebra/bmi-install-sympy-c99/packaging
python3 setup.py build
pip install -e .
⚠️ Known limitation: The C implementation ofDenefLipshitzcan fail (bas_Yuple.c:348) when the separant vanishes at$t = 0$ (pure power cases). A Python fallback is under development insrc/manual_denef_lipshitz.py.
from sympy import var
from DifferentialAlgebra import indexedbase
from src.puiseux_pipeline import find_puiseux_solutions, filter_nontrivial
xi = var("xi")
x, y = indexedbase("x,y")
# Example 1: ẏ² - x = 0 → y = C + (2/3)x^{3/2}
P1 = y[xi]**2 - x
solutions = find_puiseux_solutions(P1)
solutions = filter_nontrivial(solutions)
for s in solutions:
print(f"(a,b) = ({s['a']}, {s['b']}), y(x) = {s['puiseux_solution']}")
# Example 2: 8ẏ³ - 24ẏ² - 243y + 32 = 0 → y = 2x + 3x^{3/2} (class P_{(3/2,1)})
P2 = 8*y[xi]**3 - 24*y[xi]**2 - 243*y + 32
solutions = find_puiseux_solutions(P2)
# Example 3: Fast decision (no Denef–Lipshitz)
from src.two_algorithms import fast_decision
result, reason = fast_decision(P1, verbose=True)
print(f"Decision: {result} — {reason}")See examples/basic_examples.py for more.
| Equation | Puiseux Solution | Method | |
|---|---|---|---|
| DL | |||
| DL | |||
| DL | |||
| Congruence | |||
| Multiple solutions | multiple | - |
The Denef–Lipshitz algorithm decides the existence of formal power series solutions for systems of algebraic ordinary differential equations. The key steps are:
- Differentiate the equations to reveal constraints on the series coefficients
-
Rename derivatives as new variables (
$z^{(i)} \to z_i$ ) -
Evaluate at
$t = 0$ to obtain algebraic equations in the coefficients - Solve the resulting triangular system
The practical implementation relies on differential elimination (Rosenfeld-Gröbner) as a preprocessing step.
For a normalized polynomial of the form:
the
Any algebraic change of variable
- Denef & Lipshitz (1984) — Power Series Solutions of Algebraic Differential Equations, Math. Ann.
- Denef & Lipshitz (1989) — Decision Problems for Differential Equations, J. Symbolic Logic
- Boulier, Lemaire, Vu (2025) — The Denef–Lipshitz Algorithm in Differential Algebra, HAL-05294349
- Grigoriev & Singer (1991) — Solving ODEs in Terms of Series with Real Exponents, Trans. AMS
- Cano, Falkensteiner, Sendra (2019) — Puiseux Series Solutions for Autonomous First-Order ODEs, arXiv:1908.09196
- Ayad (2007) — Complexity of Solving ODEs in Terms of Puiseux Series, arXiv:0705.2127
- Falkensteiner, Zhang, Vo (2018) — Formal Power Series Solutions of AODEs, arXiv:1803.09646
The DifferentialAlgebra package: codeberg.org/francois.boulier/DifferentialAlgebra
Alexis Evaristo
Research intern, CRIStAL (UMR 9189), Université de Lille
Polytech Lille
📧 alexis.evaristo@polytech-lille.fr
Supervisor: François Boulier, Professor, Université de Lille
This project is licensed under the MIT License — see LICENSE for details.
The DifferentialAlgebra package is developed by François Boulier and collaborators (see its own license).
If you use this code in your research, please cite the report and/or the forthcoming preprint.