Revision: 44582
Updated Code
at April 14, 2011 13:28 by josepino
Updated Code
import java.math.BigInteger; import java.util.Random; import java.io.*; public class Karatsuba { /** * M���©todo que mediante la t���©cnica divide y vencer���¡s, multiplica dos n���ºmeros * muy grandes tras una serie de pasos. * @param u BigInteger Entero grande 1. * @param v BigInteger Entero grande 2. * @return BigInteger Resultado * JOSE PINO */ public static BigInteger karatsuba(BigInteger u, BigInteger v) { int posiciones = Math.max(u.bitLength(), v.bitLength()); //Para n menor que mil, es m���¡s eficiente la multiplicaci���³n normal. if (posiciones <= 1000) { return u.multiply(v); } posiciones = posiciones / 2; /* * Repartimos en trocitos: * u = w * 2^n + x * v = y * 2^n + z */ BigInteger w = u.shiftRight(posiciones); BigInteger x = u.subtract(w.shiftLeft(posiciones)); BigInteger y = v.shiftRight(posiciones); BigInteger z = v.subtract(y.shiftLeft(posiciones)); // Calculamos los resultados parciales BigInteger p = karatsuba(w, y); //p=w*y BigInteger q = karatsuba(x, z); //q=x*z BigInteger r = karatsuba(x.add(w), z.add(y)); //r=(x+w)*(z+y) BigInteger z1 = r.subtract(p).subtract(q); //r-p-q // Se juntan los resultados parciales para obtener el resultado global. return p.shiftLeft(2 * posiciones).add(z1.shiftLeft(posiciones)).add(q); } public static void main(String[] args) { Random rnd = new Random(); System.out.println("ALGORITMO DE KARATSUBA"); System.out.println("----------------------"); System.out.print( "Introduzca un n���ºmero de bits(Sugerencia: A poder ser mayor que 1000): "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String numero = br.readLine(); int N = Integer.parseInt(numero); //Creamos dos n���ºmeros al azar de N cifras. BigInteger x = new BigInteger(N, rnd); BigInteger y = new BigInteger(N, rnd); //System.out.println("Numero 1: " + x); //System.out.println("\n\nNumero 2: " + y); System.out.println("Multiplicamos..."); //Mediremos los tiempos de Karatsuba y Multiplicaci���³n normal para ver las diferencias. long t = System.nanoTime(); //z serÃ��Ã�ÂÂa el resultado. Hacemos la llamada al m���©todo. BigInteger z = karatsuba(x, y); t = System.nanoTime() - t; System.out.printf("\nEl valor de X es: %d " , x); System.out.printf("\nEl valor de Y es: %d " , y); System.out.printf("\nEl resultado de X*Y mediante Karatsuba es: %d " , z); System.out.println("\n\n\nN = " + N); System.out.println("\n\n\nN = " + N); System.out.println("Karatsuba: tiempo = " + t); t = System.nanoTime(); z = x.multiply(y); t = System.nanoTime() - t; System.out.println("Multiplicaci���³n Normal: tiempo = " + t); } catch (IllegalArgumentException iae) { System.err.println("Atenci���³n: Car���¡cter no valido."); System.exit( -1); } catch (IOException ioe) { System.err.println("Error de E/S"); System.exit( -1); } catch (Exception e) { System.err.println("Error inesperado. " + e.getMessage()); System.exit( -1); } } }
Revision: 44581
Updated Code
at April 14, 2011 13:27 by josepino
Updated Code
import java.math.BigInteger; import java.util.Random; import java.io.*; public class Karatsuba { /** * M�©todo que mediante la t�©cnica divide y vencer�¡s, multiplica dos n�ºmeros * muy grandes tras una serie de pasos. * @param u BigInteger Entero grande 1. * @param v BigInteger Entero grande 2. * @return BigInteger Resultado * JOSE PINO */ public static BigInteger karatsuba(BigInteger u, BigInteger v) { int posiciones = Math.max(u.bitLength(), v.bitLength()); //Para n menor que mil, es m�¡s eficiente la multiplicaci�³n normal. if (posiciones <= 1000) { return u.multiply(v); } posiciones = posiciones / 2; /* * Repartimos en trocitos: * u = w * 2^n + x * v = y * 2^n + z */ BigInteger w = u.shiftRight(posiciones); BigInteger x = u.subtract(w.shiftLeft(posiciones)); BigInteger y = v.shiftRight(posiciones); BigInteger z = v.subtract(y.shiftLeft(posiciones)); // Calculamos los resultados parciales BigInteger p = karatsuba(w, y); //p=w*y BigInteger q = karatsuba(x, z); //q=x*z BigInteger r = karatsuba(x.add(w), z.add(y)); //r=(x+w)*(z+y) BigInteger z1 = r.subtract(p).subtract(q); //r-p-q // Se juntan los resultados parciales para obtener el resultado global. return p.shiftLeft(2 * posiciones).add(z1.shiftLeft(posiciones)).add(q); } public static void main(String[] args) { Random rnd = new Random(); System.out.println("ALGORITMO DE KARATSUBA"); System.out.println("----------------------"); System.out.print( "Introduzca un n�ºmero de bits(Sugerencia: A poder ser mayor que 1000): "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String numero = br.readLine(); int N = Integer.parseInt(numero); //Creamos dos n�ºmeros al azar de N cifras. BigInteger x = new BigInteger(N, rnd); BigInteger y = new BigInteger(N, rnd); //System.out.println("Numero 1: " + x); //System.out.println("\n\nNumero 2: " + y); System.out.println("Multiplicamos..."); //Mediremos los tiempos de Karatsuba y Multiplicaci�³n normal para ver las diferencias. long t = System.nanoTime(); //z serÃ�ÂÂa el resultado. Hacemos la llamada al m�©todo. BigInteger z = karatsuba(x, y); t = System.nanoTime() - t; System.out.printf("\nEl valor de X es: %d " , x); System.out.printf("\nEl valor de Y es: %d " , y); System.out.printf("\nEl resultado de X*Y mediante Karatsuba es: %d " , z); System.out.println("\n\n\nN = " + N); System.out.println("\n\n\nN = " + N); System.out.println("Karatsuba: tiempo = " + t); t = System.nanoTime(); z = x.multiply(y); t = System.nanoTime() - t; System.out.println("Multiplicaci�³n Normal: tiempo = " + t); } catch (IllegalArgumentException iae) { System.err.println("Atenci�³n: Car�¡cter no valido."); System.exit( -1); } catch (IOException ioe) { System.err.println("Error de E/S"); System.exit( -1); } catch (Exception e) { System.err.println("Error inesperado. " + e.getMessage()); System.exit( -1); } } }
Revision: 44580
Updated Code
at April 14, 2011 13:25 by josepino
Updated Code
import java.math.BigInteger; import java.util.Random; import java.io.*; public class Karatsuba { /** * Método que mediante la técnica divide y vencerás, multiplica dos números * muy grandes tras una serie de pasos. * @param u BigInteger Entero grande 1. * @param v BigInteger Entero grande 2. * @return BigInteger Resultado * JOSE PINO */ public static BigInteger karatsuba(BigInteger u, BigInteger v) { int posiciones = Math.max(u.bitLength(), v.bitLength()); //Para n menor que mil, es más eficiente la multiplicación normal. if (posiciones <= 1000) { return u.multiply(v); } posiciones = posiciones / 2; /* * Repartimos en trocitos: * u = w * 2^n + x * v = y * 2^n + z */ BigInteger w = u.shiftRight(posiciones); BigInteger x = u.subtract(w.shiftLeft(posiciones)); BigInteger y = v.shiftRight(posiciones); BigInteger z = v.subtract(y.shiftLeft(posiciones)); // Calculamos los resultados parciales BigInteger p = karatsuba(w, y); //p=w*y BigInteger q = karatsuba(x, z); //q=x*z BigInteger r = karatsuba(x.add(w), z.add(y)); //r=(x+w)*(z+y) BigInteger z1 = r.subtract(p).subtract(q); //r-p-q // Se juntan los resultados parciales para obtener el resultado global. return p.shiftLeft(2 * posiciones).add(z1.shiftLeft(posiciones)).add(q); } public static void main(String[] args) { Random rnd = new Random(); System.out.println("ALGORITMO DE KARATSUBA"); System.out.println("----------------------"); System.out.print( "Introduzca un número de bits(Sugerencia: A poder ser mayor que 1000): "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String numero = br.readLine(); int N = Integer.parseInt(numero); //Creamos dos números al azar de N cifras. BigInteger x = new BigInteger(N, rnd); BigInteger y = new BigInteger(N, rnd); //System.out.println("Numero 1: " + x); //System.out.println("\n\nNumero 2: " + y); System.out.println("Multiplicamos..."); //Mediremos los tiempos de Karatsuba y Multiplicación normal para ver las diferencias. long t = System.nanoTime(); //z serÃÂa el resultado. Hacemos la llamada al método. BigInteger z = karatsuba(x, y); t = System.nanoTime() - t; System.out.printf("\nEl valor de X es: %d " , x); System.out.printf("\nEl valor de Y es: %d " , y); System.out.printf("\nEl resultado de X*Y mediante Karatsuba es: %d " , z); System.out.println("\n\n\nN = " + N); System.out.println("\n\n\nN = " + N); System.out.println("Karatsuba: tiempo = " + t); t = System.nanoTime(); z = x.multiply(y); t = System.nanoTime() - t; System.out.println("Multiplicación Normal: tiempo = " + t); } catch (IllegalArgumentException iae) { System.err.println("Atención: Carácter no valido."); System.exit( -1); } catch (IOException ioe) { System.err.println("Error de E/S"); System.exit( -1); } catch (Exception e) { System.err.println("Error inesperado. " + e.getMessage()); System.exit( -1); } } }
Revision: 44579
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at April 14, 2011 13:23 by josepino
Initial Code
import java.math.BigInteger; import java.util.Random; import java.io.*; public class Karatsuba { /** * Método que mediante la técnica divide y vencerás, multiplica dos números * muy grandes tras una serie de pasos. * @param u BigInteger Entero grande 1. * @param v BigInteger Entero grande 2. * @return BigInteger Resultado */ public static BigInteger karatsuba(BigInteger u, BigInteger v) { int posiciones = Math.max(u.bitLength(), v.bitLength()); //Para n menor que mil, es más eficiente la multiplicación normal. if (posiciones <= 1000) { return u.multiply(v); } posiciones = posiciones / 2; /* * Repartimos en trocitos: * u = w * 2^n + x * v = y * 2^n + z */ BigInteger w = u.shiftRight(posiciones); BigInteger x = u.subtract(w.shiftLeft(posiciones)); BigInteger y = v.shiftRight(posiciones); BigInteger z = v.subtract(y.shiftLeft(posiciones)); // Calculamos los resultados parciales BigInteger p = karatsuba(w, y); //p=w*y BigInteger q = karatsuba(x, z); //q=x*z BigInteger r = karatsuba(x.add(w), z.add(y)); //r=(x+w)*(z+y) BigInteger z1 = r.subtract(p).subtract(q); //r-p-q // Se juntan los resultados parciales para obtener el resultado global. return p.shiftLeft(2 * posiciones).add(z1.shiftLeft(posiciones)).add(q); } public static void main(String[] args) { Random rnd = new Random(); System.out.println("ALGORITMO DE KARATSUBA"); System.out.println("----------------------"); System.out.print( "Introduzca un número de bits(Sugerencia: A poder ser mayor que 1000): "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String numero = br.readLine(); int N = Integer.parseInt(numero); //Creamos dos números al azar de N cifras. BigInteger x = new BigInteger(N, rnd); BigInteger y = new BigInteger(N, rnd); //System.out.println("Numero 1: " + x); //System.out.println("\n\nNumero 2: " + y); System.out.println("Multiplicamos..."); //Mediremos los tiempos de Karatsuba y Multiplicación normal para ver las diferencias. long t = System.nanoTime(); //z serÃa el resultado. Hacemos la llamada al método. BigInteger z = karatsuba(x, y); t = System.nanoTime() - t; System.out.printf("\nEl valor de X es: %d " , x); System.out.printf("\nEl valor de Y es: %d " , y); System.out.printf("\nEl resultado de X*Y mediante Karatsuba es: %d " , z); System.out.println("\n\n\nN = " + N); System.out.println("\n\n\nN = " + N); System.out.println("Karatsuba: tiempo = " + t); t = System.nanoTime(); z = x.multiply(y); t = System.nanoTime() - t; System.out.println("Multiplicación Normal: tiempo = " + t); } catch (IllegalArgumentException iae) { System.err.println("Atención: Carácter no valido."); System.exit( -1); } catch (IOException ioe) { System.err.println("Error de E/S"); System.exit( -1); } catch (Exception e) { System.err.println("Error inesperado. " + e.getMessage()); System.exit( -1); } } }
Initial URL
Initial Description
An example of Karatsuba algorithm for multiplication of n digit numbers.
Initial Title
Multiplication of large numbers (Multiplicación de números grandes)
Initial Tags
number
Initial Language
Java