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