" There are 10 types of people those who understand binary and those who don't . "

Thursday, October 15, 2009

BigInteger Tutorial (java.math.BigInteger)

BigInteger Tutorial

From a long time I was wondering what should be my next blog topic…..since in last few months I used lot of java.math.BigInteger class in most of my programs that’s why I have decided to write a small tutorial for it…. So here we go

You might be aware of the total storage capabilities of different data types which are used to store integer values in java … to brush up you can have a look at following grid (u can skip this section :) )

Java stores all integers in memory as binary numbers.

type

Size

Range

name

bytes

bits

byte

1

8

-128 to +127

short

2

16

-32768 to +32767

int

4

32

-2147483648 to

to +2147483647

long

8

64

9223372036854775808

to

+9223372036854775807

[Source: http://leepoint.net/notes-java/data/basic_types/21integers.html]

There may be cases when we are interested in computation involving the numbers >264 so what data type should we use in that case. Java (I think 1.4.2 and higher) package comes with a BigInteger class which is designed to perform normal mathematical operation on 20-21 digit number or even high…..

Now in order to instantiate BigInteger class we can use any of the constructors specified in the following program

import java.math.BigInteger;

class Btest

{

public static void main(String args[])

{//1.BigInteger(byte[] val)

byte a[]={1,2,3,4};

BigInteger a1=new BigInteger(a);

System.out.println( a1);

/*2.BigInteger(int signum, byte[] magnitude) used to translate the sign magnitude of the BigInteger into BigInteger

signum - signum of the number (-1 for negative, 0 for zero, 1 for positive).

magnitude - big-endian binary representation of the magnitude of the number. */

BigInteger a2 = new BigInteger(1, a);

System.out.println( a2);

/*3.BigInteger(String val,int radix)

translates the String representation of BigInteger in the specified radix into a BigInteger

one can use optional minus "-"sign in the string parameter

*/

BigInteger a3 = new BigInteger("346433", 10);

System.out.println(a3);

/*4.BigInteger(String val)

translates decimal representation of a bigInteger specified in the string into corresponding BigInteger

*/

BigInteger a4=new BigInteger ("1231431543534");

System.out.println(a4);

/*5.BigInteger(int numBits,Random rnd)

this constructor generates a random BigInteger within interval [0,anitlog(numbits*log2)-1 ] */

java.util.Random r=new java.util.Random ();

BigInteger a5 = new BigInteger(32, r);

System.out.println(a5);

/*BigInteger(int bitLength,int certainty,Random rnd)

this constructor specifications leads to a randomely generated BigInteger which is probabaly prime.

Paramater bitlength specifies the bitlength of the desired BigInteger .

Parameter certainity specifies the certainity that could be tolerated by the caller

Parameter rnd is the source of random bits used to select candidates to be tested for primality.

*/

BigInteger a6 = new BigInteger(8, 56, r);

System.out.println(a6);

//Some other initialization techniques

BigInteger a6 = new BigInteger(8, 56, r);

System.out.println(a6);

BigInteger a7 = BigInteger.ONE;//can also use BigInteger.ZERO

System.out.println(a7);

BigInteger a8=BigInteger.valueOf(54353263);

System.out.println(a8);

}

}

OUTPUT

16909060

16909060

346433

1231431543534

94655163

191

1

54353263

Now we come to various methods which could be applied on BigInteger Objects. I have a written following program which involves most of the BigInteger methods however there a some more methods which are not given in program .You can get their detail here

import java.math.BigInteger;

class Btest1

{

public static void main(String args[])

/*--------------------------------Arithmetic and logical Methods--------------------------------*/

BigInteger x =BigInteger.valueOf(10);

BigInteger y = BigInteger.valueOf(8);

//add

x = x.add(BigInteger.valueOf(4));

x = x.add(y);

System.out.println(x);

//subtract

x = x.subtract(BigInteger.valueOf(4));

x = x.subtract(y);

System.out.println(x);

//divide

x = x.divide(BigInteger.valueOf(1));

x = x.divide(y);

System.out.println(x);

//multiply

x = x.multiply(BigInteger.valueOf(1));

x = x.multiply(y);

System.out.println(x);

//remainder

x = x.remainder(BigInteger.valueOf(4));

x = x.remainder(y);

System.out.println(x);

//divideAndRmainder

x = BigInteger.valueOf(43);

BigInteger s[] = new BigInteger[2];

s = x.divideAndRemainder(BigInteger.valueOf(5));

System.out.println("x/5="+s[0]+" "+"x%5="+s[1]);

s = x.divideAndRemainder(y);

System.out.println("x/y=" + s[0] + " " + "x%y=" + s[1]);

/*methods for Comparison */

//equals :returns true if parameter is equal to specified BigInteger

System.out.println (x.equals(BigInteger.valueOf(43)));

System.out.println (x.equals(y));

/*comapreTo :returns -1,0,1 depending on the value give as parameter is lesser than

,equal to,greater than the BigInteger for which the method is used */

System.out.println(x.compareTo(BigInteger.valueOf(42)));

System.out.println(x.compareTo(BigInteger.valueOf(43)));

System.out.println(x.compareTo(BigInteger.valueOf(44)));

//toString :used for String conversion

System.out.println(x.toString());

//to print corresponding byte,int,double,float,short value

System.out.println(x.byteValue());

System.out.println(x.doubleValue());

System.out.println(x.intValue());

System.out.println(x.floatValue());

System.out.println(x.shortValue());

byte x2[] = x.toByteArray();

for (int h=0;h

System.out.println(x2[h]);

/*isProbablePrime :returns true if the given BigInteger is prime ,

returns false if the given BigInteger is composite one has to menation integer value as the

parameter ,this integer value called "certainity" gives the measure of uncertainity which could be

tolerated */

System.out.println(x.isProbablePrime(23));

//pow :for raise to the power operation

System.out.println(x.pow(45));

//abs :used to return the absolute value

System.out.println(x.multiply(BigInteger.valueOf(-1)) + " " + x.multiply(BigInteger.valueOf(-1)).abs());

//negate returns -1*BigInteger

System.out.println(x.negate() + " " + x.multiply(BigInteger.valueOf(-1)).negate());

//hashCode:returns hashcode for the given BigInteger

System.out.println(x.hashCode());

//signm :Returns the signum function of the BigInteger.

System.out.println(x.signum());

/*------------------------------Bit Methods------------------------------*/

//shiftLeft

System.out.println(x.shiftLeft(4));

//shiftRight

System.out.println(x.shiftRight(4));

//bitCount returns the number of bits in two's complement notation apart frm the sign bit

System.out.println(x.bitCount());

//bitLength :returns the number of bits in minimal two's complement notation leaving the sign bit

System.out.println(x.bitLength());

//getLowestSetBit :returns the index of righmost one bit in the given BigInteger

System.out.println(x.getLowestSetBit());

//and

System.out.println(x.and(y));

//or

System.out.println(x.or(y));

//xor

System.out.println(x.xor(y));

//andNot

System.out.println(x.andNot(y));// returns x&~y

//not

System.out.println(x.not());

//testBit :returns true if designated bit is set

System.out.println(x.testBit(4));//test if ((x&(1<<4))!=0)>

/*setBit :returns a BigInteger which is generated by setting the specified bit of

the equivalent bit representation of Given BigInteger*/

System.out.println(x.setBit(4));// calculates x | (1<<4)

/*clearBit: returns a BigInteger which is generated by clearing the specified bit of

the equivalent bit representation of Given BigInteger*/

System.out.println(x.clearBit(4)); //calculates x&~(1<<4)

/*flipBit:returns a BigInteger which is generated by flipping the specified bit of

the equivalent bit representation of Given BigInteger*/

System.out.println(x.flipBit(4));//calculates x^~(1<<4)

}

}

OUTPUT

22

10

1

8

0

x/5=8 x%5=3

x/y=5 x%y=3

true

false

1

0

-1

43

43

43.0

43

43.0

43

43

true

32068636955638964644302091603013447460711607634633358021240791550942692443

-43 43

-43 43

43

1

688

2

4

6

0

8

43

35

35

-44

false

59

43

59

Till now you would be able to use the BigInteger class as per your needs .Following is a small code which I wrote to calculate the factorial of large values and store it in a text file generated at at C drive C:/fact.txt I have calculated the value of 40000!..which is incredibly huge …lol and uploaded the generated file here

import java.io.*;

import java.math.BigInteger;

class ffact

{

public static void main(String args[])throws Exception

{

BufferedReader b = new BufferedReader(new InputStreamReader(System.in));

System.out.println("enter a value");

BigInteger a = new BigInteger(b.readLine());

BigInteger a1 = BigInteger.valueOf(1),a2=BigInteger.valueOf(1);

for (a1 = BigInteger.valueOf(1); a1.compareTo(a) <= 0; a1 = a1.add(BigInteger.valueOf(1)))

a2 = a2.multiply(a1);

File f2 = new File("c:/fact.txt");

if (!f2.exists()) f2.createNewFile();

PrintWriter p = new PrintWriter(new BufferedWriter(new FileWriter(f2.getAbsolutePath())));

p.println(a2);

p.close();

}

}

Anyways its 2:10 am … i guess I need some sleep now …hope I’ll come wid a new topic soon thinking to come up with internal working of BigInteger class next time Or I’ll come up wid some other topic …..