RustPython / RustPython/pymath
Add fractions module: Rational number arithmetic
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Rust
- Estrellas
- 12
- Forks
- 1
- Merge medio
- 8 min
- PR fusionados (30 d)
- 1
Descripción
Summary
Port Python's fractions.Fraction to Rust — arbitrary-precision rational number arithmetic.
In CPython, this is a pure Python implementation (Lib/fractions.py) that internally stores a (numerator: int, denominator: int) pair, GCD-normalized with a positive denominator.
Design
Type representation
pub struct Fraction<I> {
numerator: I,
denominator: I, // always positive, coprime with numerator
}
Follow the existing _bigint feature pattern to support both num-bigint and malachite-bigint. Implement as generic over integer type or via trait bounds.
Feature flag
[features]
fractions = ["_bigint"] # requires BigInt
Same pattern as cmath behind the complex feature.
Implementation plan
Phase 1: Core struct & construction
Fractionstruct (numerator, denominator)- GCD normalization (sign normalization included: denominator always positive)
new(numerator, denominator)— primary constructorfrom_integer(n)— construct from integerfrom_float(f64)— usingf64::integer_decode()oras_integer_ratiologicfrom_coprime_ints(n, d)— direct construction from pre-normalized values (internal use)- String parsing:
"3/4","1.5","1e-2", etc.
Phase 2: Arithmetic operations
Add,Sub,Mul,Div(Rust traits)Neg,Abs- Floor division, modulo, divmod
Pow— integer exponent returns Fraction / non-integer returns f64
Arithmetic optimization: Knuth TAOCP 4.5.1 approach (pre-compute GCD in multiplication to avoid unnecessary blowup)
Phase 3: Comparison & conversion
Eq,Ord(cross-multiply comparison)as_f64()— float conversiontrunc(),floor(),ceil(),round()— integer conversionsis_integer()— checks denominator == 1as_integer_ratio()— returns (numerator, denominator) tuple
Phase 4: Special methods
limit_denominator(max_denominator)— best rational approximation via continued fraction algorithm- Hash: compatible with Python's
_hash_algorithm(modular inverse based) - Display:
"{numerator}/{denominator}"or"{numerator}"when integer - Format: float-style formatting (
.2f,e,g, etc.)
Phase 5: Testing
- Use the existing pyo3 proptest pattern from the project
- Verify bit-identical results against
fractions.Fraction - Edge cases: zero, negatives, very large numbers, float precision boundary values
Out of scope
- Python
numbers.RationalABC (replaced by Rust traits) - Direct conversion with
Decimaltype (separate module scope) - Pickle/copy (Python runtime dependent)
References
- CPython
Lib/fractions.py - https://docs.python.org/3/library/fractions.html
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza leyendo Lib/fractions.py de CPython y el patrón de feature _bigint existente en el proyecto, incluido cmath detrás del feature complex. Revisa el patrón de proptest de pyo3 antes de definir la API y el comportamiento por etapas. Se considera terminado cuando el feature fractions admite las pruebas enumeradas de construcción, aritmética, conversión, formateo y casos límite frente a fractions.Fraction.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python, rust
- Área
- backend
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 25/100