Autor Tema: ¿Cómo puedo hacer sumas y restas de números con muchos dígitos?

0 Usuarios y 1 Visitante están viendo este tema.

15 Abril, 2024, 04:26 am
Leído 65 veces

ircon_

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 1
  • País: mx
  • Karma: +0/-0
Saludos, acabo de encontrar este foro, de antemano agradezco sus tiempos.
Actualmente me encuentro desarrollando un sistema de encriptado de mensajes basado en el cifrado de hil y binario, en este mismo uso la multiplicación de matrices.

La palabra a encriptar es MARIPOSA_, al adaptarla a una matriz de 3x3 resulta en:

\begin{bmatrix}{12288}&{3}&{393216}\\{768}&{98304}&{49152}\\{786432}&{3}&{201326592}\end{bmatrix}


Mi matriz llave en este ejemplo es:

\begin{bmatrix}{1}&{-1}&{1}\\{0}&{2}&{-1}\\{2}&{3}&{0}\end{bmatrix}

Al multiplicar mi matriz llave con mi matriz inicial resulta en mi matriz producto:

\begin{bmatrix}{798720}&{1167366}&{12285}\\{99072}&{343296}&{-97536}\\{403439616}&{6031933}&{786429}\end{bmatrix}

Ahora, los valores contenidos en mi matriz producto sencillamente los ordeno en una sola fila, resultando en este número:

79872011673661228599072343296975364034396166031933786429 (56 dígitos).

A este número le estaré restando múltiples valores hasta que resulte en 0, similar al binario, el detalle es que los valores se originan de múltiplos de 3 (Adjunto una captura de ejemplo).

Mi problema es que he estado trabajando estas operaciones en Google Sheets y no había prestado atención a que, al definir el formato de la casilla a "número", me transforma el número de 56 dígitos a este:

79.872.011.673.661.200.000.000.000.000.000.000.000.000.000.000.000.000.000,00

He tratado de reducir el número de 56 dígitos con diferentes métodos para poder manejar uno con menos dígitos...

Mis 2 dudas principales serían:

• ¿Hay algún programa con el que pueda hacer operaciones usando números de este tamaño?
• ¿Qué métodos de reducción de dígitos me pudieran recomendar?

Nuevamente muchas gracias por darse el tiempo de leer mi duda y una disculpa si mi explicación no ha sido del todo clara.
Saludos.


15 Abril, 2024, 04:41 am
Respuesta #1

argentinator

  • Consultar la FIRMAPEDIA
  • Administrador
  • Mensajes: 7,739
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Vean mis posts activos en mi página personal
    • Mis posts activos (click aquí)
Hay lenguajes de programación que de forma nativa permiten trabajar con números enteros grandes.

El lenguaje Python, así como el Mathematica, permiten trabajar de esa manera,
tal que los números enteros tienen (supuestamente) precisión tan grande como uno requiera,
aunque de forma algo lenta a la hora de usarlos en los cálculos.

No obstante, son convenientes para llevar a cabo prácticas de manera entendible, por ser lenguajes de alto nivel.

Con JavaScript también es posible trabajar con enteros de precisición arbitraria
con el tipo de datos nativo BigInt.

En las últimas versiones del lenguaje C aparecen tipos de datos enteros de precisición exacta,
en la forma _BitInt(N), donde N es una expresión constante entera que denota la cantidad de bits del número entero,
aunque con un valor máximo que depende del compilador.
Por ejemplo, el compilador de Intel permite unos 8 millones de bits.

En este caso, cada variable que definas con un tipo de datos _BitInt(N) tendrá una cantidad fija N de bits
a lo largo de todo el programa, por lo cual podrías usarlo si de antemano sabés que tus datos tendrán un tamaño fijo.
Si se requiere datos sin signo, hay que anteponer unsigned, como siempre.

Se habilitan con las opciones de compilación std=c2x o bien c23, etc., según el compilador que uses.

Este tipo de datos permite los cálculos aritméticos usuales, pero.........
tienen el problema de que no hay una manera estándar de imprimir sus valores, por ejemplo con printf().
Lo adecuado aquí sería hacer un type-punning contra un array de bytes
e imprimir los dígitos hexadecimales que se obtengan tras leer tal array.


20 Abril, 2024, 11:49 pm
Respuesta #2

RDC

  • $$\Large \color{#5e8d56}\pi\,\pi\,\pi$$
  • Mensajes: 469
  • País: es
  • Karma: +0/-0
  • Nunca te creas a quién te hable del futuro
    • Privatum. Blog de ideas