Skip to main content

Números reales exactos (computables) con error certificado ≤ 1 ulp. Cero dependencias.

Project description

cabal

Números reales exactos (computables) en Python puro, cero dependencias, un solo archivo.

Cada Real es un nodo perezoso de un grafo de expresión que cumple un contrato verificable:

x.aprox(p) -> entero m  con  |m − x·2^p| ≤ 1        (para todo p ∈ ℤ)

La precisión se propaga hacia atrás bajo demanda. No eliges una precisión de trabajo y rezas: pides dígitos y el grafo calcula lo necesario para certificarlos.

from cabal import R, PI, E, raiz, exp, ln, sen

R("0.1") + R("0.2") == R("0.3")        # True — decidible y exacto (atajo racional)
PI.decimales(1000)                      # 1000 decimales correctamente redondeados (~ms)
exp(ln(R("1234.5678"))).decimales(30)   # '1234.567800000000000000000000000000'
PI.intervalo(100)                       # cerco racional certificado: (Fraction, Fraction), ancho 2^-99
(raiz(2)**2 - 2).signo(tope=1024)       # Inseparables: igualdad de opacos = semidecidible. Honesto.

📊 Validación y rendimiento → — 3 599 comprobaciones diferenciales contra mpmath (0 fallos) y un benchmark honesto frente a mpmath / decimal / sympy. Reproducible con bench/.

Garantías y cómo se verifican

  • Contrato ≤ 1 ulp por nodo, con la cota de error demostrada en comentario junto a cada implementación, y verificado empíricamente contra Fraction (oráculo exacto) en cientos de árboles aleatorios de expresiones (test_cabal.py, ancla A1).
  • Dígitos decimales correctamente redondeados (empates exactos hacia +∞), o Inseparables si el presupuesto no alcanza — nunca un dígito silenciosamente falso.
  • Atajo racional: las subexpresiones racionales viajan como Fraction; igualdad y signo de racionales son decidibles y exactos. R("0.1") es 1/10 exacto, no el double más cercano.
  • Cercos exportables: intervalo(bits) devuelve fracciones exactas lo ≤ x ≤ hi — un certificado que puedes verificar fuera de la librería.
  • Semidecidibilidad explícita: el signo de un opaco igual a 0 no es computable (Teorema de Rice de fondo). cabal lo declara con Inseparables en vez de colgar o mentir.
  • Validación cruzada reproducible: a 10 000 dígitos contra mpmath (π, e, ln 2, √2, sen 1, e^π), por fórmulas independientes en enteros puros (π vía atan(1/2)+atan(1/3), ln 2 vía Σ1/(k·2^k), e vía Σ1/k!), y en las fronteras adversariales de cada rama (reducción trigonométrica pegada a k·π/2, atan en ±3/4, ±1, ±3/2, ln junto a potencias de 2, subnormales de float). Arneses en el repo: audit_cabal.py, audit2_cabal.py, stress_cabal.py (usan mpmath; la librería, nada).

Estado del arte (claims calibrados)

No es la primera aritmética real exacta. Es una síntesis distinta:

enfoque deps contrato verificado por tests cercos racionales igualdad
cabal entero escalado (Boehm) + DAG memoizado 0 sí (vs Fraction) exacta en ℚ, semidecidible declarada
reals fracciones continuas (Gosper) 0 no no implícita
mpmath flotante de precisión fija 0 n/a (sin certificación) no tolerancia
python-flint (Arb) bolas, C C n/a bolas

El aporte es incremental en concepto (Boehm 1986) e innovador en empaque: contrato falsable + atajo racional + semidecidibilidad como API + microlibrería auditable (~700 líneas).

API

R(v) (int/Fraction/str-decimal/float), operadores + − × ÷ ** abs (también reflejados: 2 ** PI), comparaciones (±inf/nan con la semántica de Python), bool(x) = «x ≠ 0 certificado», raiz, exp, ln, sen, cos, tan, atan, constantes PI, E, LN2. Métodos: aprox(p), decimales(n), intervalo(bits), signo(tope), iguales_hasta(otro, bits), float(). Exponentes racionales (aunque lleguen como Real o float entero) usan el atajo exacto: (-R(2))**2.0 == 4 es decidible; el resto va por exp(y·ln x) y exige x > 0.

Límites (léelos)

  • Comparar dos opacos iguales —o bool/if de un cero opaco— lanza Inseparables al agotar cabal.TOPE (default 65 536 bits). Es matemática, no un bug.
  • decimales(n) necesita ~3.4·n bits de presupuesto: con TOPE default el máximo es ~19 400 dígitos; más allá, el error lo dice claro y basta subir tope=.
  • Cadenas opacas de >~10³ nodos anidados dan RecursionError (límite de CPython; sube sys.setrecursionlimit si construyes grafos muy profundos).
  • raiz de un opaco indistinguible de 0 devuelve ≈0 aunque el valor sea un negativo diminuto (se comporta como √max(x, 0)); un negativo certificable sí lanza ValueError.
  • exp de argumentos enormes (|x| ≳ 10⁵) genera enteros del tamaño del resultado, y las torres (exp(exp(exp(3)))) son números de 10⁹ bits: cuelgan por aritmética, no por bug.
  • Las series escalan O(p²): π a 40 000 dígitos ≈ 3 s; a 600 000, minutos. raiz es subcuadrática (10⁶ dígitos ≈ 11 s). El presupuesto tope/TOPE debe ser int; es estricto (nunca se sondea más allá).
  • Sin soporte de hash (igualdad semidecidible ⇒ no hashable). No es thread-safe.
  • Construir exp/ln/sen/cos evalúa una sonda barata del argumento.

Autoría

Creado por Escribano Silente. Coautor: esraderey.

MIT. python3 test_cabal.py corre las 792 anclas sin dependencias; los arneses de auditoría y estrés añaden ~3 400 verificaciones contra oráculos independientes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cabal-0.2.1.tar.gz (11.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cabal-0.2.1-py3-none-any.whl (11.5 kB view details)

Uploaded Python 3

File details

Details for the file cabal-0.2.1.tar.gz.

File metadata

  • Download URL: cabal-0.2.1.tar.gz
  • Upload date:
  • Size: 11.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for cabal-0.2.1.tar.gz
Algorithm Hash digest
SHA256 d4dbac14dec5641b2028af9aaaaf07fe2876931088016a900377fd5f141f85c7
MD5 61624ee5eaa70d1115c0a2a7b92ee7a3
BLAKE2b-256 14a3c73259eed83cad97e63ee0b76f95aa2dd49d7ac4537dd1338b7ebb651049

See more details on using hashes here.

File details

Details for the file cabal-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: cabal-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 11.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for cabal-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 aae90acd140e560c71f10af8284ab06ecda0f7a4782be2db5ebc00855a3a2f3e
MD5 a2dae985d79588cb500203cb28f0557e
BLAKE2b-256 477df6864db21b504a67e9d1f26c11b5d33032e18941bfeae39632997331f07a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page