01: // This file is part of KeY - Integrated Deductive Software Design
02: // Copyright (C) 2001-2007 Universitaet Karlsruhe, Germany
03: // Universitaet Koblenz-Landau, Germany
04: // Chalmers University of Technology, Sweden
05: //
06: // The KeY system is protected by the GNU General Public License.
07: // See LICENSE.TXT for details.
08: package de.uka.ilkd.key.strategy.termProjection;
09:
10: import java.math.BigInteger;
11:
12: import de.uka.ilkd.key.java.Services;
13: import de.uka.ilkd.key.logic.Term;
14: import de.uka.ilkd.key.rule.metaconstruct.arith.Monomial;
15:
16: public abstract class DividePolynomialsProjection extends
17: AbstractDividePolynomialsProjection {
18:
19: private DividePolynomialsProjection(
20: ProjectionToTerm leftCoefficient,
21: ProjectionToTerm polynomial) {
22: super (leftCoefficient, polynomial);
23: }
24:
25: public static ProjectionToTerm createRoundingDown(
26: ProjectionToTerm leftCoefficient,
27: ProjectionToTerm polynomial) {
28: return new DividePolynomialsProjection(leftCoefficient,
29: polynomial) {
30: protected Term divide(Monomial numerator,
31: BigInteger denominator, Services services) {
32: final BigInteger newRightCoeff = divide(numerator
33: .getCoefficient(), denominator);
34: return numerator.setCoefficient(newRightCoeff).toTerm(
35: services);
36: }
37:
38: };
39: }
40:
41: public static ProjectionToTerm createRoundingUp(
42: ProjectionToTerm leftCoefficient,
43: ProjectionToTerm polynomial) {
44: return new DividePolynomialsProjection(leftCoefficient,
45: polynomial) {
46: protected Term divide(Monomial numerator,
47: BigInteger denominator, Services services) {
48: final BigInteger newRightCoeff = divide(
49: numerator.getCoefficient().negate(),
50: denominator).negate();
51: return numerator.setCoefficient(newRightCoeff).toTerm(
52: services);
53: }
54: };
55: }
56:
57: protected BigInteger divide(BigInteger numerator,
58: BigInteger denominator) {
59: final BigInteger remainder = numerator.remainder(denominator);
60:
61: BigInteger res = numerator.divide(denominator);
62: if (remainder.signum() != 0 && numerator.signum() < 0) {
63: if (denominator.signum() > 0)
64: res = res.subtract(BigInteger.ONE);
65: else
66: res = res.add(BigInteger.ONE);
67: }
68: return res;
69: }
70: }
|