001: /*
002: * @(#)SignedMutableBigInteger.java 1.14 06/10/17
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package java.math;
028:
029: /**
030: * A class used to represent multiprecision integers that makes efficient
031: * use of allocated space by allowing a number to occupy only part of
032: * an array so that the arrays do not have to be reallocated as often.
033: * When performing an operation with many iterations the array used to
034: * hold a number is only increased when necessary and does not have to
035: * be the same size as the number it represents. A mutable number allows
036: * calculations to occur on the same number without having to create
037: * a new number for every step of the calculation as occurs with
038: * BigIntegers.
039: *
040: * Note that SignedMutableBigIntegers only support signed addition and
041: * subtraction. All other operations occur as with MutableBigIntegers.
042: *
043: * @see BigInteger
044: * @version 1.6, 02/02/00
045: * @author Michael McCloskey
046: * @since 1.3
047: */
048:
049: class SignedMutableBigInteger extends MutableBigInteger {
050:
051: /**
052: * The sign of this MutableBigInteger.
053: */
054: int sign = 1;
055:
056: // Constructors
057:
058: /**
059: * The default constructor. An empty MutableBigInteger is created with
060: * a one word capacity.
061: */
062: SignedMutableBigInteger() {
063: super ();
064: }
065:
066: /**
067: * Construct a new MutableBigInteger with a magnitude specified by
068: * the int val.
069: */
070: SignedMutableBigInteger(int val) {
071: super (val);
072: }
073:
074: /**
075: * Construct a new MutableBigInteger with a magnitude equal to the
076: * specified MutableBigInteger.
077: */
078: SignedMutableBigInteger(MutableBigInteger val) {
079: super (val);
080: }
081:
082: // Arithmetic Operations
083:
084: /**
085: * Signed addition built upon unsigned add and subtract.
086: */
087: void signedAdd(SignedMutableBigInteger addend) {
088: if (sign == addend.sign)
089: add(addend);
090: else
091: sign = sign * subtract(addend);
092:
093: }
094:
095: /**
096: * Signed addition built upon unsigned add and subtract.
097: */
098: void signedAdd(MutableBigInteger addend) {
099: if (sign == 1)
100: add(addend);
101: else
102: sign = sign * subtract(addend);
103:
104: }
105:
106: /**
107: * Signed subtraction built upon unsigned add and subtract.
108: */
109: void signedSubtract(SignedMutableBigInteger addend) {
110: if (sign == addend.sign)
111: sign = sign * subtract(addend);
112: else
113: add(addend);
114:
115: }
116:
117: /**
118: * Signed subtraction built upon unsigned add and subtract.
119: */
120: void signedSubtract(MutableBigInteger addend) {
121: if (sign == 1)
122: sign = sign * subtract(addend);
123: else
124: add(addend);
125: if (intLen == 0)
126: sign = 1;
127: }
128:
129: /**
130: * Print out the first intLen ints of this MutableBigInteger's value
131: * array starting at offset.
132: */
133: public String toString() {
134: BigInteger b = new BigInteger(this, sign);
135: return b.toString();
136: }
137:
138: }
|