.NET 4.0+

# The BigInteger Structure

*Under some circumstances the standard integer data types provided by the .NET framework provide a range of values that is restrictive. The BigInteger structure, introduced in version 4.0 of the framework, removes the size limits.*

## BigInteger Methods

The BigInteger structure includes a number of methods. Some are identical to those of other integer types, except that they work with larger values. Others repeat the functionality provided by some of the operators described above. These are useful for languages that do not support overloaded operators but are unnecessary for C# developers. I will not describe these two groups of methods in this article. The remaining methods are described in the following sections.

### Abs

The *Abs* method is a static method of the BigInteger type. It returns the absolute value of a BigInteger. ie. If the initial value is positive it is returned unchanged. If it is negative, the sign is removed in the return value. The method, and some of the others listed below, are similar to those found in the Math class but work with larger values.

BigInteger big1 = BigInteger.Parse("100000000000000000000"); BigInteger big2 = BigInteger.Parse("-100000000000000000000"); BigInteger abs = BigInteger.Abs(big1); // 100000000000000000000 abs = BigInteger.Abs(big2); // 100000000000000000000

### Max and Min

The *Max* and *Min* methods each accept two arguments, both BigIntegers. Max returns the higher of the two numbers and Min returns the lower value.

BigInteger big1 = BigInteger.Parse("100000000000000000000"); BigInteger big2 = BigInteger.Parse("-100000000000000000000"); BigInteger max = BigInteger.Max(big1, big2); // 100000000000000000000 BigInteger min = BigInteger.Min(big1, big2); // -100000000000000000000

### Log and Log10

*Log* and *Log10* are used to obtain the logarithm of a BigInteger value. When Log is used with only the BigInteger parameter, the natural logarithm is returned. You can add a second parameter, containing a double, to specify the base to use. Log10 only accepts a single BigInteger argument and returns the base-10 logarithm of that value.

double log = BigInteger.Log(big); // 46.051701859880907 double log2 = BigInteger.Log(big, 2); // 66.438561897747235 double log10 = BigInteger.Log10(big); // 19.999999999999996

### Pow

The *Pow* method allows you to raise a BigInteger to a given power. The method differs slightly from Math.Pow as the power value is provided as an integer, rather than a double.

BigInteger big = BigInteger.Pow(2, 100); // 1267650600228229401496703205376

### ModPow

*ModPow* combines raising a value to a specified power and executing a modulus operation. The method accepts three parameters, each a BigInteger. The first argument is raised to the power of the second. A modulus division is then performed upon the result, using the value in the third parameter as the divisor.

The code below raises 2 to the power of 100 and then finds the remainder of dividing the result by 1,000. Note that the returned value is the last three digits of the result of the previous, *Pow* example.

BigInteger big = BigInteger.ModPow(2, 100, 1000); // 376

### GreatestCommonDivisor

The last method we will review is *GreatestCommonDivisor*. This returns the largest integer value that a pair of BigIntegers can both be divided by without remainder. A *GCD* algorithm is described in the "Rational Number Arithmetic" article. With the introduction of BigIntegers, this calculation is built into the .NET framework.

BigInteger big1 = BigInteger.Parse("41758540882408627201"); BigInteger big2 = BigInteger.Parse("19120211505964799"); BigInteger gcd = BigInteger.GreatestCommonDivisor(big1, big2); // 479001599

## BigInteger Properties

In the final section of this article we will examine the properties provided by the BigInteger structure. These fall into two categories. Firstly there are several static properties that can be used to generate fixed BigInteger values without using a constructor, assignment operator or parse method. Secondly there are some instance properties that return information about a BigInteger value.

### Static Properties

Three static properties are available in the BigInteger structure. Each simply returns a predefined BigInteger value. The properties generate values of one, zero or negative one. Some developers may prefer to use these properties for readability. Others may prefer to simply assign a literal when creating a new instance.

BigInteger big; big = BigInteger.Zero; // 0 big = BigInteger.One; // 1 big = BigInteger.MinusOne; // -1

### Instance Properties

There are five instance properties provided by the BigInteger structure in .NET 4.0. The first four of these each return a Boolean value that describes the value. You can use these to quickly check if the value is one or zero, if the value is even or if it is an exact power of 2. Examples of each are shown below:

bool result; result = BigInteger.One.IsOne; // true result = BigInteger.One.IsZero; // false result = BigInteger.One.IsEven; // false result = BigInteger.One.IsPowerOfTwo; // true

The fifth property returns an integer that represents the sign of the BigInteger. If the BigInteger is negative the return value of the *Sign* property is -1. If positive the result is 1 and if the original value is zero, the result will also be zero.