📄 big_ops3.cpp
字号:
/************************************************** BigInt Binary Operators Source File ** (C) 1999-2002 The Botan Project **************************************************/#include <botan/bigint.h>#include <botan/numthry.h>#include <botan/mp_core.h>#include <iostream>#include <iomanip>namespace Botan {/************************************************** Addition Operator **************************************************/BigInt operator+(const BigInt& x, const BigInt& y) { if((x.sign() == y.sign())) { BigInt z(x.sign(), std::max(x.sig_words(), y.sig_words()) + 1); bigint_add3(z.get_reg(), x.data(), x.sig_words(), y.data(), y.sig_words()); return z; } else if(x.is_positive()) return (x - y.abs()); else return (y - x.abs()); }/************************************************** Subtraction Operator **************************************************/BigInt operator-(const BigInt& x, const BigInt& y) { s32bit relative_size = bigint_cmp(x.data(), x.sig_words(), y.data(), y.sig_words()); if(relative_size == 0 && (x.sign() == y.sign())) return BigInt::zero(); if(relative_size == 0 && (x.sign() != y.sign())) return (x << 1); BigInt z(Positive, std::max(x.sig_words(), y.sig_words()) + 1); if(relative_size == -1) { if(x.sign() == y.sign()) bigint_sub3(z.get_reg(), y.data(), y.sig_words(), x.data(), x.sig_words()); else bigint_add3(z.get_reg(), x.data(), x.sig_words(), y.data(), y.sig_words()); z.set_sign(y.reverse_sign()); } if(relative_size == 1) { if(x.sign() == y.sign()) bigint_sub3(z.get_reg(), x.data(), x.sig_words(), y.data(), y.sig_words()); else bigint_add3(z.get_reg(), x.data(), x.sig_words(), y.data(), y.sig_words()); z.set_sign(x.sign()); } return z; }/************************************************** Multiplication Operator **************************************************/BigInt operator*(const BigInt& x, const BigInt& y) { if(x.is_zero() || y.is_zero()) return BigInt::zero(); Sign sign = Positive; if(x.sign() != y.sign()) sign = Negative; const u32bit x_sw = x.sig_words(); const u32bit y_sw = y.sig_words(); if(x_sw == 1 || y_sw == 1) { BigInt z(sign, x_sw + y_sw); if(x_sw == 1) bigint_linmul3(z.get_reg(), y.data(), y_sw, x.word_at(0)); else bigint_linmul3(z.get_reg(), x.data(), x_sw, y.word_at(0)); return z; } BigInt z(sign, x.size() + y.size()); bigint_mul3(z.get_reg(), z.size(), x.data(), x.size(), x_sw, y.data(), y.size(), y_sw); return z; }/************************************************** Division Operator **************************************************/BigInt operator/(const BigInt& x, const BigInt& y) { BigInt q, r; divide(x, y, q, r); return q; }/************************************************** Modulo Operator **************************************************/BigInt operator%(const BigInt& n, const BigInt& mod) { if(mod.is_zero()) throw BigInt::DivideByZero(); if(mod.is_negative()) throw Invalid_Argument("BigInt::operator%: modulus must be > 0"); BigInt q, r; divide(n, mod, q, r); return r; }/************************************************** Modulo Operator **************************************************/word operator%(const BigInt& n, word mod) { if(mod == 0) throw BigInt::DivideByZero(); if(power_of_2(mod)) return (n.word_at(0) & (mod - 1)); BigInt q, r; divide(n, mod, q, r); return r.word_at(0); }/************************************************** Left Shift Operator **************************************************/BigInt operator<<(const BigInt& x, u32bit shift) { if(shift == 0) return x; const u32bit shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; BigInt y(x.sign(), x.sig_words() + shift_words + (shift_bits ? 1 : 0)); bigint_shl2(y.get_reg(), x.data(), x.sig_words(), shift_words, shift_bits); return y; }/************************************************** Right Shift Operator **************************************************/BigInt operator>>(const BigInt& x, u32bit shift) { if(shift == 0) return x; if(x.bits() <= shift) return BigInt::zero(); const u32bit shift_words = shift / MP_WORD_BITS, shift_bits = shift % MP_WORD_BITS; BigInt y(x.sign(), x.sig_words() - shift_words); bigint_shr2(y.get_reg(), x.data(), x.sig_words(), shift_words, shift_bits); return y; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -