| 3466 | } |
| 3467 | |
| 3468 | void PositiveAdd(Integer &sum, const Integer &a, const Integer& b) |
| 3469 | { |
| 3470 | int carry; |
| 3471 | if (a.reg.size() == b.reg.size()) |
| 3472 | carry = Add(sum.reg, a.reg, b.reg, a.reg.size()); |
| 3473 | else if (a.reg.size() > b.reg.size()) |
| 3474 | { |
| 3475 | carry = Add(sum.reg, a.reg, b.reg, b.reg.size()); |
| 3476 | CopyWords(sum.reg+b.reg.size(), a.reg+b.reg.size(), a.reg.size()-b.reg.size()); |
| 3477 | carry = Increment(sum.reg+b.reg.size(), a.reg.size()-b.reg.size(), carry); |
| 3478 | } |
| 3479 | else |
| 3480 | { |
| 3481 | carry = Add(sum.reg, a.reg, b.reg, a.reg.size()); |
| 3482 | CopyWords(sum.reg+a.reg.size(), b.reg+a.reg.size(), b.reg.size()-a.reg.size()); |
| 3483 | carry = Increment(sum.reg+a.reg.size(), b.reg.size()-a.reg.size(), carry); |
| 3484 | } |
| 3485 | |
| 3486 | if (carry) |
| 3487 | { |
| 3488 | sum.reg.CleanGrow(2*sum.reg.size()); |
| 3489 | sum.reg[sum.reg.size()/2] = 1; |
| 3490 | } |
| 3491 | sum.sign = Integer::POSITIVE; |
| 3492 | } |
| 3493 | |
| 3494 | void PositiveSubtract(Integer &diff, const Integer &a, const Integer& b) |
| 3495 | { |