Elementary Number Theory in C#

I thought I’d post a few code snippets in C# that have to do with basic number theory, since I use them in my programs from time to time. These snippets are by no means optimized, and the use of C# pretty much precludes their use in high-performance applications. Still, for relatively small arguments, these routines run surprisingly fast.

Prime numbers

To generate a list of prime numbers, we use the familiar Sieve of Eratosthenes. We can write one routine to generate the sieve:

The above function returns an array of booleans (the size of the given parameter), each of which is false if the array index is a prime number, or true if it’s not a prime number. To get an actual list of prime numbers, we can use a function such as this:

The above function returns an actual list of primes less than or equal to the specified high limit. This means that we can easily compute the prime-counting function $$\pi(x)$$ for any integer x by counting the number of elements in the array returned by the function. We can write a similar function to generate a list of composites:

As for determining if a single certain number is prime (without having to generate a giant sieve), we can simply use a function that attempts to factor the number. If the number happens to be divisible by an integer greater than 1 and less than or equal to its square root, then the number is not prime:

Greatest Common Divisor and Totient

To obtain the greatest common divisor (GCD) of two numbers, we use the usual Euclidean algorithm:

There is a slightly different binary algorithm for computing the GCD which is theoretically more efficient, but in practice (at least in C#) it’s actually slightly less efficient than the algorithm above:

With the GCD readily available, determining whether two numbers are coprime is just a matter of telling whether or not their GCD is equal to 1. Also, calculating the LCM (least common multiple) of two numbers becomes trivial:

Also using the GCD algorithm, it becomes easy to calculate Euler’s totient function for a certain number, since the totient function is simply the number of integers less than or equal to n that are coprime to n:

The above is a really naive algorithm. A much more efficient algorithm (one that is usually given in textbooks) is as follows: