Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Bueno, por el asunto y el resumen seguramente ya estareis imaginando de que va este tema, variables para numeros muy grandes, enormes, de un numero de bits que decida el programador en el momento de programar (y si es posible de un numero de bits que se decida en ejecucion mejor).
Ya tengo conocimientos de programacion en C, y he echo algunos programillas que de momento no han sido gran cosa, he usado la libreria SDL y como anotacion personal me encanta la informatica y cada vez me gustaria programar teniendo mas control sobre lo que programo (a ver si algun dia me animo y me paso por la seccion de ensamblador de este foro para aprender un poco).
Lo que me gustaria saber hacer en C, entre otras cosas, es poder manejar numeros mas grandes de lo que me permite un long o un unsigne long, ¿alguien sabe como o almenos por donde podria empezar a afrontar esta cuestion de variables de numeros grandes?, se que hay multitud de librerias en la red, para esto, para lo otro...; pero me gustaria (igual que hay quien se pone ha hacer librerias ya sea en ensamblador o en C o c++) hacerlo mediante C sin necesidad de usar librerias, se que ahorran trabajo pero es por curiosidad y por saber como hacerlo (y que siempre viene bien saber contra más mejor, y si todos usamos librerias siempre a ver quien se pone a hacerlas despues, jejeje), dejando bromas aparte quisiera saber como manejar numeros muy grandes usando solo C, programandolo manualmente sin complementos ni librerias.
Gracias de antemano a todos por la ayuda que podais brindar y por el tiempo de leeros este tema.
P.D.: en principio no tengo un uso ahora mismo para este tema de numeros muy grandes mas que el de aprender, aunque lo mismo despues si consigo llevar a cabo esta idea de los numeros grandes puede que me anime a aplicarlo en un programa con alguna utilidad y no solo por probar, he leido algunos articulos sobre el algoritmo RSA por lo que podria ser una buena forma de poner en practica el uso de numeros grandes.
Urriellu, lo de usar un puntero es una de las respuestas que publicasteis tambien, si no recuerdo mal la publico jorcoval, y me parecio bastante sencillo hacer un puntero con el numero de bytes que necesite, por eso intente probar esa solucion
El puntero se utiliza para guardar la referencia al array donde se almacena el valor, pero tienes que implementarlo de manera que el usuario nunca ve ese puntero, no lo necesita para nada, y ese puntero debe cambiar de valor cada vez que el tamaño de la variable de precisión arbitraria cambie de valor, porque en ese momento necesitas reservar memoria para almacenar la variable del nuevo tamaño Y copiar los datos del viejo al nuevo array.
pues lo de usar un array es algo que tambien he estado pensando pero antes de decidirme si hacerlo a array pense en probar la idea de los punteros, que es mas sencilla
La cosa no funciona así. Un array es realmente un puntero a la primera posición de un trozo de memoria donde tienes una serie de variables del mismo tipo almacenadas consecutivamente.
Lo que haces es que en cualquier momento puedas reservar un nuevo trozo de memoria donde vas a almacenar los valores y hacer que el puntero haga referencia a ese nuevo trozo de memoria, de manera que la "misma" ahora tenga más espacio para ser almacenada.
Si lo de los punteros no funcona lo hare seguramente con un array y creando funciones para manejarlo
Si utilizas un array en lugar de un array dinámico (un puntero que va haciendo referencia a distintos trozos de memoria que acabas de reservar) podrás hacer lo mismo pero sólo podrás trabajar con variables del tamaño especificado en tiempo de compilación, no de ejecución.
lo unico que no entiendo por que no se puede usar un puntero que reserve x bytes de memoria como una sola variable (o por lo menos eso te he entendido en el ultimo mensaje), ¿que impide usar un puntero de un numero de bytes grande como una sola variable y no como array?.
Puedes reservar la memoria que te dé la gana (bueno... no exactamente) pero no puedes utilizar la cantidad de bits que te dé la gana para operar con ellos directamente. Los procesadores saben sumar (y poco más) variables de un solo tamaño de datos, algunas arquitecturas soportan varios tamaños (por ejemplo en x86 creo que puedes sumar variables de 4, 8, 16 y 32 bits, pero en un PIC16F sólo puedes sumar variables de 8 bits). Todas las demás operaciones aritméticas (restar, multiplicar, dividir, exponenciar...) deben hacerse utilizando algoritmos escritos en lenguaje ensamblador, que normalmente implementa el compilador que estés utilizando. Cada compilador te ofrece una serie de tipos de variables y especifica qué tamaño tiene cada tipo y qué operaciones puedes realizar con cada uno de ellos. Si el compilador no te ofrece un tipo de variable que te interese entonces tienes que implementarla tú en lenguaje ensamblador o en un lenguaje de alto nivel que pueda ser compilado por el compilador que estés utilizando.
Por ejemplo, si quieres tener variables de 224 bits para almacenar números enteros sin signo del 0 al 26959946667150639794667015087019630673637144422540572481103610249215, tienes que:
-Implementar una clase que contenga un array con 7 índices de 32 bits cada uno
-Implementar funciones (para esa clase) para hacer cada una de las operaciones aritméticas básicas utilizando esos índices de manera individual (cosa nada fácil)
-Sobrecargar los operadores aritméticos y de comparación para poder utilizar esos objetos/variables como si fuesen variables normales
Ojo, esto sería una variable de 224 bits, no una variable de precisión arbitraria, así que no podrías almacenar valores mayores que 26959946667150639794667015087019630673637144422540572481103610249215
Si quisieses implementar una clase para números de cualquier tamaño, el array debería ser dinámico (y no de un tamaño fijo), y además habría que implementar funciones que lo gestionen, es decir que lo redimensionen según lo necesites.
Por lo que estoy viendo, no tienes claras cosas básicas y estás intentando construir la muralla china sin saber poner ladrillos. Además lo estás intentando hacer en un lenguaje que no te ayuda ni lo más mínimo porque te obliga a preocuparte de cosas que llevan bastante tiempo y parece que además no entiendes bien. Y otra cosa, no es por meterme contigo pero este tipo de cosas cuando te interesa hacerlas lo que hace la gente es pasarse horas y horas leyendo, informándose y buscando ejemplos, no esperando que se lo den todo mascado.
¿que impide usar un puntero de un numero de bytes grande como una sola variable y no como array?.
porque un puntero simplemente es un apuntador a una dirección de memoria. Para usar una variable primero la tienes que definir y los compiladores sólo tienen unos pocos tipos definidos. Así vuelves a estar como al principio: necesitas crearte ese tipo de variable tú mismo; además de todas las operaciones aritméticas que necesites.
Por lo que estoy viendo, no tienes claras cosas básicas y estás intentando construir la muralla china sin saber poner ladrillos. Además lo estás intentando hacer en un lenguaje que no te ayuda ni lo más mínimo porque te obliga a preocuparte de cosas que llevan bastante tiempo y parece que además no entiendes bien. Y otra cosa, no es por meterme contigo pero este tipo de cosas cuando te interesa hacerlas lo que hace la gente es pasarse horas y horas leyendo, informándose y buscando ejemplos, no esperando que se lo den todo mascado.
En un primer lugar, no es que no tenga las cosas claras, sino que no te entendia el por que me decias que un puntero no me ayudaba para nada, que eso habia que hacerlo por array, cuando ahora dices que tiene que ser un array dinamico (un puntero), por lo que eso es lo que me liaba, que mientras los demas no decian que un puntero estuviese mal tu estabas con que tenia que ser un array, cosa que no es util a no ser que se sepa de antemano el tamaño del numero que se piense usar, por lo que mejor recurir al uso de memoria de forma dinamica, un puntero.
Lo de que el procesador no puede hacer apenas poco mas que sumar (incluso al restar suma) y operaciones logicas ya lo tengo mas que leido de manuales de aritmetica binaria, lo que no sabia si al usar un puntero el compilador ya preparaba el codigo del programa para operar con el como una sola variable (no estaba seguro de si lo hacia el compilador igual que hace otras cosas que en otros lenguajes como ensamblador no existen y hay que hacerlas como los bucles).
Y en cuanto a lo de que si me interesa debo leer en vez de esperar las cosas masticadas, estas muy confundido pues si quisiera las cosas masticadas huviera puesto al principio del tema "posten un condigo en c para usar numeros muy muy grandes" y a mi no me interesa un codigo ya escrito, para eso me hubiera descargado una libreria. Desde antes de empezar este tema he buscado y leido informacion mas de la que te podrias imaginar, ya se que las operaciones las tendre que crear como funciones para poder trabajar con los numeros, lo unico que queria ultimar era si el compilador admitia trabajar con el puntero todos los bytes a la vez o no lo admitia y entonces trabajarlos por separado. Se trabajar con los punteros, cosa diferente es que no me ro a array solo al array que se define de forma estatica.
Sobre esto de los números grandes y supergrandes, variables y matrices de longitud dinámica, etc. el límite depende de la capacidad de memoria, entonces se puede almacenar el número en cuestión o ecuaciones equivalentes que pueden generar un número enorme o procesos de compresión.
Para lo anterior se necesita de procesadores cada vez más rápidos mientras la necesidad de cifras aumente. Pero por otro lado, una tecnología disruptiva para computación cuántica ayudará en muchos problemas que son difíciles de resolver usando cómputo clásico, por no decir que algunos son imposibles con las técnicas tradicionales.
En criptografía y óptica cuántica, por ejemplo, ya se ha conseguido transmitir Qubits. Ahora falta que se construya el primer procesador cuántico. Existe un prototipo creado por D-Wave que se aproxima, pero es solo un primer paso.
Chris, he de admitir que no he tenido el placer de leer sobre computo cuantico, y sobre criptografia cuantica poco, solo sobre un prototipo de protocolo que usaba fotones o algo asi generados con un laser y transmitidos por fibra optica, pero aunque en eso que afirmaban su funcionamiento para transmisiones seguras, no estoi demasiado informado sobre su utilidad en la aceleracion de calculos, si tuvieras algun link interesante para almenos leer algo al respecto seria interesante.
Lo del procesador cuantico es bastante interesante, si te acuerdas o sabes, de alguna pagina buena donde expongan algunos detalles te lo agradeceria.
Gracias a todos por todo.