You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by re...@apache.org on 2010/06/21 08:47:22 UTC
svn commit: r956455 - in
/harmony/enhanced/java/trunk/classlib/modules/math/src:
main/java/java/math/BigInteger.java
test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java
Author: regisxu
Date: Mon Jun 21 04:24:35 2010
New Revision: 956455
URL: http://svn.apache.org/viewvc?rev=956455&view=rev
Log:
Simplify BigInteger.modPow, pow 0 should be always 1.
Modified:
harmony/enhanced/java/trunk/classlib/modules/math/src/main/java/java/math/BigInteger.java
harmony/enhanced/java/trunk/classlib/modules/math/src/test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java
Modified: harmony/enhanced/java/trunk/classlib/modules/math/src/main/java/java/math/BigInteger.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/math/src/main/java/java/math/BigInteger.java?rev=956455&r1=956454&r2=956455&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/math/src/main/java/java/math/BigInteger.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/math/src/main/java/java/math/BigInteger.java Mon Jun 21 04:24:35 2010
@@ -1344,8 +1344,8 @@ public class BigInteger extends Number i
if (m.isOne() | (exponent.sign > 0 & base.sign == 0)) {
return BigInteger.ZERO;
}
- if (base.sign == 0 && exponent.sign == 0) {
- return BigInteger.ONE;
+ if (exponent.sign == 0) {
+ return BigInteger.ONE.mod(m);
}
if (exponent.sign < 0) {
base = modInverse(m);
Modified: harmony/enhanced/java/trunk/classlib/modules/math/src/test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/trunk/classlib/modules/math/src/test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java?rev=956455&r1=956454&r2=956455&view=diff
==============================================================================
--- harmony/enhanced/java/trunk/classlib/modules/math/src/test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java (original)
+++ harmony/enhanced/java/trunk/classlib/modules/math/src/test/java/org/apache/harmony/tests/java/math/BigIntegerModPowTest.java Mon Jun 21 04:24:35 2010
@@ -47,6 +47,13 @@ public class BigIntegerModPowTest extend
} catch (ArithmeticException e) {
assertEquals("Improper exception message", "BigInteger: modulus not positive", e.getMessage());
}
+
+ try {
+ BigInteger.ZERO.modPow(new BigInteger("-1"), new BigInteger("10"));
+ fail("ArithmeticException has not been caught");
+ } catch (ArithmeticException e) {
+ // expected
+ }
}
/**
@@ -95,6 +102,29 @@ public class BigIntegerModPowTest extend
assertEquals("incorrect sign", 1, result.signum());
}
+ public void testModPowZeroExp() {
+ BigInteger exp = new BigInteger("0");
+ BigInteger[] base = new BigInteger[] {new BigInteger("-1"), new BigInteger("0"), new BigInteger("1")};
+ BigInteger[] mod = new BigInteger[] {new BigInteger("2"), new BigInteger("10"), new BigInteger("2147483648")};
+
+ for (int i = 0; i < base.length; ++i) {
+ for (int j = 0; j < mod.length; ++j) {
+ assertEquals(base[i] + " modePow(" + exp + ", " + mod[j]
+ + ") should be " + BigInteger.ONE, BigInteger.ONE,
+ base[i].modPow(exp, mod[j]));
+ }
+ }
+
+ mod = new BigInteger[] {new BigInteger("1")};
+ for (int i = 0; i < base.length; ++i) {
+ for (int j = 0; j < mod.length; ++j) {
+ assertEquals(base[i] + " modePow(" + exp + ", " + mod[j]
+ + ") should be " + BigInteger.ZERO, BigInteger.ZERO,
+ base[i].modPow(exp, mod[j]));
+ }
+ }
+ }
+
/**
* modInverse: non-positive modulus
*/