
// PrimeNuts.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Test of Prime functions in the Nut class, and probablePrime()
   and nextProbablePrime() in BigInteger

   One of the key features is the loading of pre-calculated primes
   from the primes1M.txt file, which contains the first million primes
   (2 - 15,485,863). This data came from 
     https://t5k.org/lists/small/millions/
   Another source:
     http://www.prime-numbers.org/

   Usage:
     > compile PrimeNuts.java
     > run PrimeNuts
*/

import java.math.*;
import java.util.*;



public class PrimeNuts
{

  public static void main(String[] args)
  {
    BigInteger bigVal = new BigInteger("29996224275833");
    System.out.println("Is " + bigVal + " prime? " +  Nut.isPrime(bigVal));  // true

    System.out.println("Is " + bigVal + " probably prime? " +  
                                 bigVal.isProbablePrime(1));  // true

    System.out.println("Next probable prime = " +  
                                 bigVal.nextProbablePrime());

    System.out.println();
    int[] primes = Nut.loadPrimes("primes1M.txt");
    // System.out.println(Arrays.toString(primes));

    System.out.println("\nBiggest prime loaded: " + primes[primes.length-1]);
	System.out.println("No. of loaded primes: " + primes.length );

    System.out.println("\nIs 97 prime? " + 
                 Nut.isPrime(97, primes));   // true
    System.out.println("Is 200 prime? " + 
                 Nut.isPrime(200, primes));  // false

    System.out.println("\nGenerate primes locally...");
    int[] primesLocal = Nut.getPrimes(100);
    System.out.println("All primes <= 100: \n  " + 
                                   Arrays.toString(primesLocal));

    System.out.println("\nIs 97 prime? " + 
                 Nut.isPrime(97, primesLocal));   // true
    System.out.println("Is 6 prime? " + 
                 Nut.isPrime(6, primesLocal));    // false
    System.out.println("Is 200 prime? " + 
                 Nut.isPrime(200, primesLocal));   // out of range

    System.out.println("totient(50) = " +  Nut.totient(50, primesLocal));
                // 20 integers < 50 are relatively prime with 50

    System.out.println();
    System.out.println("Generate totient() without using a primes list:");
    BigInteger n = new BigInteger("14");
    BigInteger i = new BigInteger("1");
    while (i.compareTo(n) <= 0) { 
      System.out.println("totient(" + i + ") = " +  Nut.totient(i));
      i = i.add(BigInteger.ONE);
    }  

  }   // end of main()



}  // end of PrimeNuts class

