📄 mp_mul.cpp
字号:
/************************************************** MP Multiplication Source File ** (C) 1999-2002 The Botan Project **************************************************/#include <botan/mp_core.h>#include <botan/util.h>namespace Botan {namespace {/************************************************** Simple O(N^2) Multiplication **************************************************/void simple_multiply(word* const z, const word* x, u32bit x_size, const word* y, u32bit y_size) { for(u32bit j = 0; j != x_size; j++) { word carry = 0, x_j = x[j]; for(u32bit k = 0; k != y_size; k++) { dword product = (dword)z[j+k] + (dword)x_j * y[k] + carry; z[j+k] = MP_LOW_WORD(product); carry = MP_HIGH_WORD(product); } z[j+y_size] = carry; } }/************************************************** Length Checking **************************************************/bool use_operation(u32bit x_sw, u32bit y_sw, u32bit x_size, u32bit y_size, u32bit limit, u32bit min = 0) { return (x_sw <= limit && y_sw <= limit && x_size >= limit && y_size >= limit && (x_sw + y_sw) >= min); }}/************************************************** MP Multiplication **************************************************/void bigint_mul3(word* const z, u32bit, const word* x, u32bit x_size, u32bit x_sw, const word* y, u32bit y_size, u32bit y_sw) { static const u32bit KARATSUBA_16_BOUND = 24; static const u32bit KARATSUBA_32_BOUND = 48; static const u32bit KARATSUBA_64_BOUND = 96; static const u32bit KARATSUBA_128_BOUND = 192; if(x_size < 4 || y_size < 4) simple_multiply(z, x, x_sw, y, y_sw); else if(use_operation(x_sw, y_sw, x_size, y_size, 4)) bigint_comba4(z, x, y); else if(use_operation(x_sw, y_sw, x_size, y_size, 8)) bigint_comba8(z, x, y); else if(use_operation(x_sw, y_sw, x_size, y_size, 16, KARATSUBA_16_BOUND)) bigint_karat16(z, x, y); else if(use_operation(x_sw, y_sw, x_size, y_size, 32, KARATSUBA_32_BOUND)) bigint_karat32(z, x, y); else if(use_operation(x_sw, y_sw, x_size, y_size, 64, KARATSUBA_64_BOUND)) bigint_karat64(z, x, y); else if(use_operation(x_sw, y_sw, x_size, y_size, 128, KARATSUBA_128_BOUND)) bigint_karat128(z, x, y); else simple_multiply(z, x, x_sw, y, y_sw); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -