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
2525 }
2626 if(m == 0){
2727 mpassign(b1, sum);
28+ sum->sign = 1;
2829 return;
2930 }
3031 mpbits(sum, (n+1)*Dbits);
libmp/mpdiv.c+11−5
@@ -9,7 +9,7 @@ · 8 unmodified lines
99 void
1010 mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder)
1111 {
12− int j, s, vn, sign;
12+ int j, s, vn, sign, qsign, rsign;
1313 mpdigit qd, *up, *vp, *qp;
1414 mpint *u, *v, *t;
1515
@@ -22,7 +22,9 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) · 6 unmodified lines
2222
2323 // division by one or small powers of two
2424 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);
2628 if(quotient != nil){
2729 sign = divisor->sign;
2830 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
4749 mpassign(mpzero, quotient);
4850 return;
4951 }
52+
53+ qsign = divisor->sign * dividend->sign;
54+ rsign = dividend->sign;
5055
5156 // D1: shift until divisor, v, has hi bit set (needed to make trial
5257 // divisor accurate)
@@ -119,14 +124,15 @@ mpdiv(mpint *dividend, mpint *divisor, mpint *quotient, mpint *remainder) · 66 unmodified lines
119124 if(qp != nil){
120125 assert((quotient->flags & MPtimesafe) == 0);
121126 mpnorm(quotient);
122− if(dividend->sign != divisor->sign)
123− quotient->sign = -1;
127+ if(quotient->top != 0)
128+ quotient->sign = qsign;
124129 }
125130
126131 if(remainder != nil){
127132 assert((remainder->flags & MPtimesafe) == 0);
128133 mpright(u, s, remainder); // u is the remainder shifted
129− remainder->sign = dividend->sign;
134+ if(remainder->top != 0)
135+ remainder->sign = rsign;
130136 }
131137
132138 mpfree(t);
libmp/mplogic.c+6−2
@@ -36,7 +36,7 @@ mplogic(mpint *b1, mpint *b2, mpint *sum, int fl) · 35 unmodified lines
3636 b2 = t;
3737 fl = fl >> 2 & 0x03 | fl << 2 & 0x0c | fl & 0x30;
3838 }
39− mpbits(sum, b1->top*Dbits);
39+ mpbits(sum, b1->top*Dbits+1);
4040 dp1 = b1->p;
4141 dp2 = b2->p;
4242 dpo = sum->p;
@@ -60,6 +60,8 @@ mplogic(mpint *b1, mpint *b2, mpint *sum, int fl) · 17 unmodified lines
6060 dpo[i] = d;
6161 }
6262 sum->top = i;
63+ if(co)
64+ dpo[sum->top++] = co;
6365 mpnorm(sum);
6466 }
6567
@@ -105,7 +107,7 @@ mpxor(mpint *b1, mpint *b2, mpint *sum) · 39 unmodified lines
105107 }
106108 fl = (b1->sign & 10) ^ (b2->sign & 12);
107109 sum->sign = (int)(fl << 28) >> 31 | 1;
108− mpbits(sum, b1->top*Dbits);
110+ mpbits(sum, b1->top*Dbits+1);
109111 dp1 = b1->p;
110112 dp2 = b2->p;
111113 dpo = sum->p;
@@ -126,6 +128,8 @@ mpxor(mpint *b1, mpint *b2, mpint *sum) · 14 unmodified lines
126128 dpo[i] = d;
127129 }
128130 sum->top = i;
131+ if(co)
132+ dpo[sum->top++] = co;
129133 mpnorm(sum);
130134 }
131135

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