History

merge

aiju committed 8 years ago

Commit 175d88f2 parents 658bdec 943e1423 files · +18 −7Browse files

Unified · Split

3 files
  1. libmp/mpadd.c +1 −0
  2. libmp/mpdiv.c +11 −5
  3. libmp/mplogic.c +6 −2
libmp/mpadd.c+1−0
@@ -25,6 +25,7 @@ mpmagadd(mpint *b1, mpint *b2, mpint *sum) · 24 unmodified lines
25 }25 }
26 if(m == 0){26 if(m == 0){
27 mpassign(b1, sum);27 mpassign(b1, sum);
28 sum->sign = 1;
28 return;29 return;
29 }30 }
30 mpbits(sum, (n+1)*Dbits);31 mpbits(sum, (n+1)*Dbits);
libmp/mpdiv.c+11−5
@@ -9,7 +9,7 @@ · 8 unmodified lines
9void9void
10mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)10mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
11{11{
12 int j, s, vn, sign;12 int j, s, vn, sign, qsign, rsign;
13 mpdigit qd, *up, *vp, *qp;13 mpdigit qd, *up, *vp, *qp;
14 mpint *u, *v, *t;14 mpint *u, *v, *t;
15 15
@@ -22,7 +22,9 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) · 6 unmodified lines
22 22
23 // division by one or small powers of two23 // division by one or small powers of two
24 if(divisor->top == 1 && (divisor->p[0] & divisor->p[0]-1) == 0){24 if(divisor->top == 1 && (divisor->p[0] & divisor->p[0]-1) == 0){
25 vlong r = (vlong)dividend->sign * (dividend->p[0] & divisor->p[0]-1);25 vlong r = 0;
26 if(dividend->top > 0)
27 r = (vlong)dividend->sign * (dividend->p[0] & divisor->p[0]-1);
26 if(quotient != nil){28 if(quotient != nil){
27 sign = divisor->sign;29 sign = divisor->sign;
28 for(s = 0; ((divisor->p[0] >> s) & 1) == 0; s++)30 for(s = 0; ((divisor->p[0] >> s) & 1) == 0; s++)
@@ -47,6 +49,9 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) · 18 unmodified lines
47 mpassign(mpzero, quotient);49 mpassign(mpzero, quotient);
48 return;50 return;
49 }51 }
52
53 qsign = divisor->sign * dividend->sign;
54 rsign = dividend->sign;
50 55
51 // D1: shift until divisor, v, has hi bit set (needed to make trial56 // D1: shift until divisor, v, has hi bit set (needed to make trial
52 // divisor accurate)57 // divisor accurate)
@@ -119,14 +124,15 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) · 66 unmodified lines
119 if(qp != nil){124 if(qp != nil){
120 assert((quotient->flags & MPtimesafe) == 0);125 assert((quotient->flags & MPtimesafe) == 0);
121 mpnorm(quotient);126 mpnorm(quotient);
122 if(dividend->sign != divisor->sign)127 if(quotient->top != 0)
123 quotient->sign = -1;128 quotient->sign = qsign;
124 }129 }
125 130
126 if(remainder != nil){131 if(remainder != nil){
127 assert((remainder->flags & MPtimesafe) == 0);132 assert((remainder->flags & MPtimesafe) == 0);
128 mpright(u, s, remainder); // u is the remainder shifted133 mpright(u, s, remainder); // u is the remainder shifted
129 remainder->sign = dividend->sign;134 if(remainder->top != 0)
135 remainder->sign = rsign;
130 }136 }
131 137
132 mpfree(t);138 mpfree(t);
libmp/mplogic.c+6−2
@@ -36,7 +36,7 @@ mplogic(mpint *b1, mpint *b2, mpint *sum, int fl) · 35 unmodified lines
36 b2 = t;36 b2 = t;
37 fl = fl >> 2 & 0x03 | fl << 2 & 0x0c | fl & 0x30;37 fl = fl >> 2 & 0x03 | fl << 2 & 0x0c | fl & 0x30;
38 }38 }
39 mpbits(sum, b1->top*Dbits);39 mpbits(sum, b1->top*Dbits+1);
40 dp1 = b1->p;40 dp1 = b1->p;
41 dp2 = b2->p;41 dp2 = b2->p;
42 dpo = sum->p;42 dpo = sum->p;
@@ -60,6 +60,8 @@ mplogic(mpint *b1, mpint *b2, mpint *sum, int fl) · 17 unmodified lines
60 dpo[i] = d;60 dpo[i] = d;
61 }61 }
62 sum->top = i;62 sum->top = i;
63 if(co)
64 dpo[sum->top++] = co;
63 mpnorm(sum);65 mpnorm(sum);
64}66}
65 67
@@ -105,7 +107,7 @@ mpxor(mpint *b1, mpint *b2, mpint *sum) · 39 unmodified lines
105 }107 }
106 fl = (b1->sign & 10) ^ (b2->sign & 12);108 fl = (b1->sign & 10) ^ (b2->sign & 12);
107 sum->sign = (int)(fl << 28) >> 31 | 1;109 sum->sign = (int)(fl << 28) >> 31 | 1;
108 mpbits(sum, b1->top*Dbits);110 mpbits(sum, b1->top*Dbits+1);
109 dp1 = b1->p;111 dp1 = b1->p;
110 dp2 = b2->p;112 dp2 = b2->p;
111 dpo = sum->p;113 dpo = sum->p;
@@ -126,6 +128,8 @@ mpxor(mpint *b1, mpint *b2, mpint *sum) · 14 unmodified lines
126 dpo[i] = d;128 dpo[i] = d;
127 }129 }
128 sum->top = i;130 sum->top = i;
131 if(co)
132 dpo[sum->top++] = co;
129 mpnorm(sum);133 mpnorm(sum);
130}134}
131 135

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t