📄 biginteger.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
namespace RSA
{
public sealed class BigInteger
{
private const int maxLength = 80; //最大32位无符号整数长度,80*32 = 2560位
private uint[] data; //用于保存大数组
public int dataLength; //实际使用32位无符号整数长度
//用无符号整形数构造
public BigInteger(String inData)
{
dataLength = inData.Length;
if (dataLength > maxLength)
throw (new ArithmeticException("用无符号整形数构造溢出。"));
data = new uint[maxLength];
for (int i = dataLength - 1, j = 0; i >= 0; i--, j++)
data[j] = inData[i] - 48;
}
//重载 + 运算
public static BigInteger operator +(BigInteger bi1, BigInteger bi2) {
BigInteger result = new BigInteger();
result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
long carry = 0;
for (int i = 0; i < result.dataLength; i++)
{
long sum = (long)bi1.data[i] + (long)bi2.data[i] + carry;
carry = sum >> 32;
result.data[i] = (uint)(sum & 0xFFFFFFFF);
}
return result;
}
public static BigInteger operator -(BigInteger bi1, BigInteger bi2) {
BigInteger result = new BigInteger();
result.dataLength = (bi1.dataLength > bi2.dataLength) ? bi1.dataLength : bi2.dataLength;
long carryIn = 0;
for (int i = 0; i < result.dataLength; i++)
{
long diff = (long)bi1.data[i] - (long)bi2.data[i] - carryIn;
result.data[i] = (uint)(diff & 0xFFFFFFFF);
carryIn = (diff < 0) ? 1 : 0;
}
// 若进位位〈0高位部分设置为负数补码形式
if (carryIn != 0)
{
for (int i = result.dataLength; i < maxLength; i++)
result.data[i] = 0xFFFFFFFF;
result.dataLength = maxLength;
}
while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
result.dataLength--;
return result;
}
public static BigInteger operator *(BigInteger bi1, BigInteger bi2) {
int lastPos = maxLength - 1;
bool bi1Neg = false, bi2Neg = false;
// 取绝对值
if ((bi1.data[lastPos] & 0x80000000) != 0)
{ // bi1 是负数
bi1Neg = true; bi1 = -bi1;
}
if ((bi2.data[lastPos] & 0x80000000) != 0)
{ // bi2 是负数
bi2Neg = true; bi2 = -bi2;
}
BigInteger result = new BigInteger();
// 绝对值乘法
for (int i = 0; i < bi1.dataLength; i++)
{
if (bi1.data[i] == 0) continue;
ulong mcarry = 0;
for (int j = 0, k = i; j < bi2.dataLength; j++, k++)
{
ulong val = (bi1.data[i] * bi2.data[j]) + result.data[k] + mcarry;
result.data[k] = (uint)(val & 0xFFFFFFFF);
mcarry = (val >> 32);
}
if (mcarry != 0) result.data[i + bi2.dataLength] = (uint)mcarry;
}
result.dataLength = bi1.dataLength + bi2.dataLength;
if (result.dataLength > maxLength)
result.dataLength = maxLength;
while (result.dataLength > 1 && result.data[result.dataLength - 1] == 0)
result.dataLength--;
// 输入的两个数符号相反,则为 -ve
if (bi1Neg != bi2Neg)
return -result;
return result;
}
public static BigInteger operator /(BigInteger bi1, BigInteger bi2) {
}
public static BigInteger operator %(BigInteger bi1, BigInteger bi2) {
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -