Development Class Java

/*
 * @(#)Mersenne.java  1.0 Apr 26, 2008
 *
 *  The MIT License
 *
 *  Copyright (c) 2008 Malachi de AElfweald 
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
//package org.eoti.math.prime;
import java.math.BigInteger;
import java.util.*;
public class Mersenne
{
  protected static BigInteger two = BigInteger.valueOf(2);
  protected static String[] primes = new String[]{
      "2","3","5","7","13","17","19","31","61","89","107","127","521","607",    // M1-M14
      "1279","2203","2281","3217","4253","4423","9689","9941","11213", "19937",  // M15-M23
      "21701","23209","44497","86243","110503","132049","216091","756839",      // M24-M32
      "859433","1257787","1398269","2976221","3021377","6972593","13466917",    // M33-M39
      // indexes of rest could be wrong
      "20996011","24036583","25964951","30402457","32582657","37156667",      // M40-M45???
      "42643801", "43112609"                                    // M46-M47???
  };
  protected BigInteger value;
  protected int index;
  public Mersenne(int index)
  {
    this.index = index;
    value = two.pow(Integer.parseInt(primes[index-1]));
    value = value.subtract(BigInteger.ONE);
  }
  // Per common Mersenne Prime tables, index is 1-based
  public int getIndex(){return index;}
  public Integer getN(){return Integer.parseInt(primes[index-1]);}
  public Integer getBitLength(){return getN();}
  public Integer getDigitLength(){return (""+getValue()).length();}
  public BigInteger getValue(){return value;}
  public static Iterable iterator()
  {
    return new Iterable()
    {
      public Iterator iterator()
      {
        return new MersenneIter();
      }
    };
  }
  static class MersenneIter
    implements Iterator
  {
    protected int currIndex = 0;
    MersenneIter(){}
    public boolean hasNext()
    {
      return currIndex <= primes.length;
    }
    public Mersenne next()
    {
      return new Mersenne(++currIndex);
    }
    public void remove()
    {
      throw new UnsupportedOperationException("Remove not implemented");
    }
  }
}