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.

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.0.tar.gz (11.3 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.0-py3-none-any.whl (11.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: cabal-0.2.0.tar.gz
  • Upload date:
  • Size: 11.3 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.0.tar.gz
Algorithm Hash digest
SHA256 bff92da8911821a00576c203594bfd1eaa908e4d64eb2e573c57f75780e216e7
MD5 62fc8b05bb4650af96848b2af1c68417
BLAKE2b-256 534f99afa1cdc65c49a4f0f436817a054956e50fbc629da5ed2c1b13cb7b690f

See more details on using hashes here.

File details

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

File metadata

  • Download URL: cabal-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 11.2 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.0-py3-none-any.whl
Algorithm Hash digest
SHA256 002aaea69d257680c70c4b35356122a6bce090a0774d6d95e34a3d4ce2b8ecdb
MD5 e263b3dcb3349d22fab2f2a0fcffa1c7
BLAKE2b-256 06945fa8d8567f0c98e5975f03eb2558d0a697d52c124702fd7cb90ef6c92006

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