All Downloads are FREE. Search and download functionalities are using the official Maven repository.

java.math.Division Maven / Gradle / Ivy

/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package java.math;

/**
 * Static library that provides all operations related with division and modular
 * arithmetic to {@link BigInteger}. Some methods are provided in both mutable
 * and immutable way. There are several variants provided listed below:
 *
 * 
    *
  • Division *
      *
    • {@link BigInteger} division and remainder by {@link BigInteger}.
    • *
    • {@link BigInteger} division and remainder by {@code int}.
    • *
    • gcd between {@link BigInteger} numbers.
    • *
    *
  • *
  • Modular arithmetic *
      *
    • Modular exponentiation between {@link BigInteger} numbers.
    • *
    • Modular inverse of a {@link BigInteger} numbers.
    • *
    *
  • *
*/ class Division { /** * Divides an array by an integer value. Implements the Knuth's division * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2. * * @return remainder */ static int divideArrayByInt(int[] quotient, int[] dividend, final int dividendLength, final int divisor) { long rem = 0; long bLong = divisor & 0xffffffffL; for (int i = dividendLength - 1; i >= 0; i--) { long temp = (rem << 32) | (dividend[i] & 0xffffffffL); long quot; if (temp >= 0) { quot = (temp / bLong); rem = (temp % bLong); } else { /* * make the dividend positive shifting it right by 1 bit then * get the quotient an remainder and correct them properly */ long aPos = temp >>> 1; long bPos = divisor >>> 1; quot = aPos / bPos; rem = aPos % bPos; // double the remainder and add 1 if a is odd rem = (rem << 1) + (temp & 1); if ((divisor & 1) != 0) { // the divisor is odd if (quot <= rem) { rem -= quot; } else { if (quot - rem <= bLong) { rem += bLong - quot; quot -= 1; } else { rem += (bLong << 1) - quot; quot -= 2; } } } } quotient[i] = (int) (quot & 0xffffffffL); } return (int) rem; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy