-
Notifications
You must be signed in to change notification settings - Fork 2
/
Integral.java
40 lines (31 loc) · 838 Bytes
/
Integral.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package prelude;
public abstract class Integral<A> {
public final Real<A> real;
public final Enumeration<A> enumeration;
public Integral(Real<A> real, Enumeration<A> enumeration) {
this.real = real;
this.enumeration = enumeration;
}
public A quot(A x, A y) {
return quotRem(x, y)._1();
}
public A rem(A x, A y) {
return quotRem(x, y)._2();
}
public A div(A x, A y) {
return divMod(x, y)._1();
}
public A mod(A x, A y) {
return divMod(x, y)._2();
}
public abstract P2<A, A> quotRem(A x, A y);
public P2<A, A> divMod(A n, A d) {
P2<A, A> qr = quotRem(n, d);
A q = qr._1();
A r = qr._2();
Num<A> num = real.num;
if (num.eq.eq(num.signum(r), num.negate(num.signum(d))))
return P.p(num.minus(q, num.fromInteger(1)), num.plus(r, d));
return qr;
}
}