[Codigo] Interesante codigo imprime numero primo de mayor cifras

Iniciado por Miky Gonzalez, 12 Octubre 2013, 14:07 PM

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

Miky Gonzalez

Solo por interés, les dejo un código proveniente de una fuente web que les dejo más abajo:

#include <stdio.h>

int m = 1711276033, N = 1, t[1 << 25] = { 2 }, a, *p, i, e = 39717691, s, c, U = 1;

void g(int d, int h) {
for(i = s; i < 1 << 24; i *= 2)
d = d * 1LL * d % m;
for(p = t; p < t + N; p += s)
for(i = s, c = 1; i; i--)
a = p[s] * (h ? c : 1LL) % m, p[s] = (m * 1U + *p - a) * (h ? 1LL : c) % m, *p = (a * 1U + *p) % m, p++, c = c * 1LL * d % m;
}

int main() {
while(e /= 2) {
N *= 2;
U = U * 1LL * (m + 1) / 2 % m;
for(s = N; s /= 2;)
g(40, 0);
for(p = t; p < t + N; p++)
*p = *p * 1LL ** p % m * U % m;
for(s = 1; s < N; s *= 2)
g(983983719, 1);
for(a = 0, p = t; p < t + N;)
a += *p << (e & 1), *p++ = a % 10, a /= 10;
}
while(!*--p);
for(t[0]--; p >= t;)
putchar(48 + *p--);

return 0;
}


[1] http://ijunkey.com/a-small-c-program-to-print-the-biggest-prime-number/
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

erest0r

Cruzar la calle junto a mucha gente cuando el semáforo sigue en rojo da seguridad y espíritu de equipo... o cruzamos todos o morimos juntos.

eferion

Estupendo ejemplo sobre cómo no se debe de programar.

No quito el mérito de programarlo, ya que tiene su curro... pero desde luego el código no es capaz de leerlo cualquiera.

0xDani

Cita de: eferion en 12 Octubre 2013, 21:25 PM
Estupendo ejemplo sobre cómo no se debe de programar.

No quito el mérito de programarlo, ya que tiene su curro... pero desde luego el código no es capaz de leerlo cualquiera.

No hay comentarios que expliquen el workflow del programa, y las variables tienen nombres que no dicen nada. Eso combinado con que se trate de un programa que realiza operaciones matemáticas medianamente complejas es suficiente para que sea casi ilegible.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

vangodp

O sea que el programador este es un artista cifrando código :laugh:

ivancea96

CitarThis program computes 243112609-1, which is the biggest
known prime number (about 13 million digits
Yo creo que se saben primos más grandes :o

Mirad, hice este código hace un tiempo, que calcula el primer programa que hizo Steve Wozniak:
Código (cpp) [Seleccionar]
#include <iostream>
int i=63, f[11]={29,7,0,3,-79,87,-8,3,-6,-8,-67}, c=0;
int main () {
i+=9;
for(int k=f[2]-1;i!=34;k++,i+=f[k]){
  std::cout << (char)i;
  c = (i*5!=165)? c:c+=1;
  i = c<3? i:i+=1;
  k=(bool)c?k=1:k;
}
system("pause > nul");
return 0;
}

Corredlo y disfrutadlo.

rir3760

Cita de: ivancea96 en 13 Octubre 2013, 16:39 PMhice este código hace un tiempo
Cada una de las tres sentencias:
Código (cpp) [Seleccionar]
c = (i * 5!=165)? c:c+=1;
i = c<3? i:i+=1;
k = (bool)c?k=1:k;

Tiene dos problemas.

El mas importante es la posibilidad, dependiendo de la expresión que controla al operador "?:", de acceder y modificar una variable en dos ocasiones entre puntos de secuencia y eso no es valido (comportamiento no definido).

El otro es el uso forzado del operador "?:" ya que no tiene caso almacenar en una variable el valor de ... esa variable. Es mejor utilizar tres sentencias condicionales "if":
Código (cpp) [Seleccionar]
if (i == 33)
   c++;
if (c >= 3)
   i++;
if (c)
   k = 1;


Espero el comentario se tome como una critica constructiva.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Miky Gonzalez

La cosa estaba en poner los códigos de la manera más ofuscada posible  :xD
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

ivancea96

rir3760, cuando hice ese código, era obviamente para ofuscarlo. Creo que todo el mundo sabe, que u programa como ese (compílese quién no sepa que hace), se puede hacer con infinita menos complejidad de la que tiene.

Un operador ternario, supone un mayor tiempo de razonamiento para saber qué hace, que una sentencia condicional "IF()".