GMP compared to JAVA

Nustenil Segundo nustenilsegundo at gmail.com
Fri Dec 21 00:37:54 CET 2007


Hi,

I did a aplication with GMP and other same in JAVA.
This aplication calculates the value of the operation a^b mod m, for
a, b and m randomical numbers of n bits, n in interval [5, 25000).

The code in C (using GMP):

#include <gmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main()
{
   //Declaração de variáveis
   mpz_t op1, op2, mod, x, aux, exp;
   gmp_randstate_t state;
   unsigned long int n = 4, seed, i, j;
   clock_t ini, fim, temp;
   FILE *p;

   srand(time(NULL));

   //inicialização das variáveis do tipo GMP
   mpz_init(op2);
   mpz_init(x);
   mpz_init(op1);
   mpz_init(mod);
   mpz_init(aux);
   mpz_init(exp);
   gmp_randinit_default(state);
   //abre o arquivo "arquivo.txt" para escrita
   p = fopen("arquivomassa.txt", "w");

   //laço para medir os bits e o tempo
   for(i=5 ; i<25000; i+=10){

              mpz_init_set_ui (exp,  1);
              seed= rand();
              gmp_randseed_ui (state,seed);
        //laço para o cálculo de 2^exp
              for(j=1; j<=i; j++){
                       mpz_mul_ui(exp, exp, 2);
              }

              mpz_urandomb(aux, state, i);  //aux Ã(c) um número
aleatório de 0 a 2^i-1
              mpz_add (op1, aux, exp);      //op1 Ã(c) um número de (i+1) bits

              mpz_urandomb(aux, state, i);  //aux Ã(c) um número
aleatório de 0 a 2^i-1
              mpz_add (op2, aux, exp);      //op2 Ã(c) um número de (i+1) bits

              mpz_urandomb(aux, state, i);  //aux Ã(c) um número
aleatório de 0 a 2^i-1
              mpz_add (mod, aux, exp);      //mod Ã(c) um número de (i+1) bits

              //calcula o tempo de [((op1)^(p2)) mod (mod)] e armazena em temp
              ini = clock();
              mpz_powm (x, op1,  op2, mod);
              fim = clock();
              temp = fim - ini;

              printf("%lu\n", 1000*(unsigned long) temp/CLOCKS_PER_SEC);
            //armazena em arquivo.txt a quantidade de bits e o tempo
da operação
              fprintf(p, "%lu\t%lu\n", i+1, 1000*(unsigned
long)temp/CLOCKS_PER_SEC);
   }

    gmp_randclear (state);
    mpz_clear (op1);
    mpz_clear (op2);
    mpz_clear (mod);
    mpz_clear (x);
    mpz_clear (aux);
    mpz_clear (exp);


    return 0;
}

The code in JAVA:

import java.io.IOException ;
import java.io.RandomAccessFile;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Calendar;



public class Big {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
//        String saida = "";
        BigDecimal aux = new BigDecimal("16");
//        BigDecimal condicaoParada = new BigDecimal("10").pow(1000);
        long cont = 5;
        String fimDeLinha = System.getProperty(" line.separator");
        RandomAccessFile arquivo = new RandomAccessFile("tabela.txt","rw");
        while(cont < 25000){
            BigDecimal aleatorio = (new BigDecimal(
Math.random()).multiply(aux)).add(aux);
            BigInteger p = new
BigInteger(aleatorio.toString().substring(0, aleatorio.toString
().indexOf(".")));
            aleatorio = (new BigDecimal(Math.random()).multiply(aux)).add(aux);
            BigInteger q = new
BigInteger(aleatorio.toString().substring(0,
aleatorio.toString().indexOf(".")));
            aleatorio = (new BigDecimal(Math.random()).multiply(aux)).add(aux);
            BigInteger m = new BigInteger(
aleatorio.toString().substring(0, aleatorio.toString().indexOf(".")));
//            saida += ;
            String saida = cont+" \t"+calculaTempo(p, q, m)+fimDeLinha;
            arquivo.seek (arquivo.length());
            arquivo.write(saida.getBytes());
            System.out.print(saida);
            cont+=10;
            aux = aux.multiply(new BigDecimal("1024"));
        }
//         System.out.println(saida);
    }

    private static long calculaTempo(BigInteger p, BigInteger q, BigInteger m) {
        long tempoInicial = Calendar.getInstance().getTimeInMillis();
        BigInteger calculo = p.modPow(q, m);
//        BigInteger calculo = powBigInteger(p, q).mod(m);
//        q.
        long tempoFinal = Calendar.getInstance().getTimeInMillis();
//        System.out.println("------ "+calculo);
        return tempoFinal - tempoInicial;
    }


}


For the result in C with n = 10005 bits the time was 2800 ms (a example).

For the result in JAVA with n = 10005 bits the time was 10 ms (a example).


Why this difference?

Thanks,

Nustenil Segundo de Moraes Lima Marinus


More information about the gmp-discuss mailing list