Java Mutable BigInteger Class

前端 未结 3 1464
既然无缘
既然无缘 2021-02-02 16:27

I am doing calculations with BigIntegers that uses a loop that calls multiply() about 100 billion times, and the new object creation from the BigInteger is making it very slow.

3条回答
  •  感动是毒
    2021-02-02 16:32

    I copied MutableBigInteger, then commented out some methods' bodies I dind't need, adding a nice

    throw new UnsupportedOperationException("...");
    

    when invoked.

    here is how it looks.

    In Revisions you can see what's changed from the original java.math.MutableBigInteger.

    I also added some convenience methods,

    public void init(long val) {};
    public MutableBigInteger(long val) {};
    // To save previous value before modifying.
    public void addAndBackup(MutableBigInteger addend) {}
    // To restore previous value after modifying.  
    public void restoreBackup() {}
    

    Here is how I used it:

    private BigInteger traverseToFactor(BigInteger offset, BigInteger toFactorize, boolean forward) {
        MutableBigInteger mbiOffset = new  MutableBigInteger(offset);
        MutableBigInteger mbiToFactorize = new MutableBigInteger(toFactorize);
        MutableBigInteger blockSize = new MutableBigInteger(list.size);
    
        if (! MutableBigInteger.ZERO.equals(mbiOffset.remainder(blockSize))) {
            throw new ArithmeticException("Offset not multiple of blockSize");
        }
    
        LongBigArrayBigList pattern = (LongBigArrayBigList) list.getPattern();
    
        while (true) {
            MutableBigInteger divisor = new MutableBigInteger(mbiOffset);
            for (long i = 0; i < pattern.size64(); i++) {
                long testOperand = pattern.getLong(i);
                MutableBigInteger.UNSAFE_AUX_VALUE.init(testOperand);
                divisor.addAndBackup(MutableBigInteger.UNSAFE_AUX_VALUE);
                if (MutableBigInteger.ZERO.equals(mbiToFactorize.remainder(divisor))) {
                    return divisor.toBigInteger();
                }
                divisor.restoreBackup();
            }
    
            if (forward) {
                mbiOffset.add(blockSize);
            } else {
                mbiOffset.subtract(blockSize);
            }
            System.out.println(mbiOffset);
        }
    }
    

提交回复
热议问题