Here is one example:
The first known prime found to exceed one million digits was discovered in 1999, and is a Mersenne prime of the form 269725931; it contains exactly 2,098,960 digits. Subsequently other Mersenne primes, of the form 2p1, have been found which contain more digits.
However, in 2004 there was found a massive non-Mersenne prime which contains 2,357,207 digits: 28433*2^7830457+1.
Find the last ten digits of this prime number.
Here is the code:
public static void main(String[] args) { long start = System.nanoTime() ; long value = 1; long LIMIT = 10000000000l; for (int i = 1 ; i <=7830457 ; i++) { value = value * 2; value =value%LIMIT; } value = value * 28433; value =value%LIMIT; value = value + 1 ; value =value%LIMIT; long end = System.nanoTime() ; System.out.println("result = " + value); System.out.println("computation time = " + ( (end - start) / 1000 ) + " ms"); }See, the solution is short and very efficient.
Here is another one:
Triangle, pentagonal, and hexagonal numbers are generated by the following formulae:
Triangle T(n)=n(n+1)/2 1, 3, 6, 10, 15, ...
Pentagonal P(n)=n(3n-1)/2 1, 5, 12, 22, 35, ...
Hexagonal H(n)=n(2n-1) 1, 6, 15, 28, 45, ...
It can be verified that T(285) = P(165) = H(143) = 40755.
Find the next triangle number that is also pentagonal and hexagonal.
/** http://projecteuler.net/problem=45 Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: Triangle T(n)=n(n+1)/2 1, 3, 6, 10, 15, ... Pentagonal P(n)=n(3n-1)/2 1, 5, 12, 22, 35, ... Hexagonal H(n)=n(2n-1) 1, 6, 15, 28, 45, ... It can be verified that T(285) = P(165) = H(143) = 40755. Find the next triangle number that is also pentagonal and hexagonal. * * @author lei zou * */ public class Problem045 { private static final BigInteger TWO = new BigInteger("2"); static public BigInteger[] setTriangleArray(int base, BigInteger[] triangles) { for (int i=1; i<=triangles.length; i++) { BigInteger n = new BigInteger( Integer.toString(i+base) ); BigInteger n2 = new BigInteger( Integer.toString( (i+base)+1) ) ; triangles[i-1] = n.multiply(n2); triangles[i-1] = triangles[i-1].divide(TWO); } //System.out.println("Triangle is " + Triangle[Triangle.length-1] ); return triangles; } static public BigInteger[] setPentagonalArray(int base, BigInteger[] pentagonals) { for (int i=1; i<=pentagonals.length; i++) { BigInteger n = new BigInteger( Integer.toString(i+base) ); BigInteger n2 = new BigInteger( Integer.toString( ( 3* (i+base) -1 ) ) ) ; pentagonals[i-1] = n.multiply(n2); pentagonals[i-1] = pentagonals[i-1].divide(TWO); } //System.out.println("Pentagonal is " + pentagonals[pentagonals.length-1] ); return pentagonals; } static public BigInteger[] setHexagonalArray(int base, BigInteger[] hexagonals) { for (int i=1; i<=hexagonals.length; i++) { BigInteger n = new BigInteger( Integer.toString(i+base) ); BigInteger n2 = new BigInteger( Integer.toString( ( 2* (i+base) -1 ) ) ) ; hexagonals[i-1] = n.multiply(n2); } return hexagonals; } public static void main(String[] args) { int limit = 1000; BigInteger[] Triangle = new BigInteger[limit]; BigInteger[] Pentagonal = new BigInteger[limit]; BigInteger[] Hexagonal = new BigInteger[limit]; setTriangleArray(0, Triangle); setPentagonalArray(0, Pentagonal); setHexagonalArray(0, Hexagonal); int cnt=0; int upperTriangle=limit, upperPentagonal=limit, upperHexagonal=limit; int lowTriangle=0, lowPentagonal=0, lowHexagonal=0; int i=0, j=0, k=0; BigInteger max = new BigInteger("0"); while (cnt<3) { while (i<upperTriangle && j<upperPentagonal && k<upperHexagonal) { if (Triangle[i-lowTriangle].equals(Pentagonal[j-lowPentagonal]) && Pentagonal[j-lowPentagonal].equals(Hexagonal[k-lowHexagonal]) ) { System.out.print( (cnt+1) + "th" + " number is " + Triangle[i-lowTriangle] ); System.out.println(" Triangle index: " + (++i) + " Pentagonal index: " + (++j) + " Hexagonal index: " + (++k) ); cnt++; } max = Triangle[i-lowTriangle].compareTo( Pentagonal[j-lowPentagonal] ) > 0 ? Triangle[i-lowTriangle] : Pentagonal[j-lowPentagonal]; max = Hexagonal[k-lowHexagonal].compareTo(max) > 0 ? Hexagonal[k-lowHexagonal] : max; // while (i<upperTriangle && Triangle[i-lowTriangle].compareTo(max) <0 ) i++; while (j<upperPentagonal && Pentagonal[j-lowPentagonal].compareTo(max)<0 ) j++; while (k<upperHexagonal && Hexagonal[k-lowHexagonal].compareTo(max)<0 ) k++; } //System.out.println("Triangle: " + (i) + " Pentagonal: " + (j) + " Hexagonal: " + (k) + " max " + max ); if (i==upperTriangle) { lowTriangle = i; setTriangleArray(i, Triangle); upperTriangle+=Triangle.length; } if (j==upperPentagonal) { lowPentagonal = j; setPentagonalArray(j, Pentagonal); upperPentagonal += Pentagonal.length; } if (k==upperHexagonal) { lowHexagonal = k; setHexagonalArray(k, Hexagonal); upperHexagonal += Hexagonal.length; } } } }Not sure that is the best solution. But it does solve the problem.
No comments:
Post a Comment