Java BigInteger 实现大数运算及取余操作

版权申诉
0 下载量 196 浏览量 更新于2024-09-03 收藏 11KB PDF 举报
"Java大数运算使用BigInteger进行大数乘法和取余操作的实践代码示例" 在Java编程中,当我们需要处理超出普通整型数据范围的大整数时,可以使用`java.math.BigInteger`类。`BigInteger`类提供了一个方便且高效的环境来进行大数运算,包括加、减、乘、除、幂以及取模等操作。在这个例子中,代码展示了如何计算91的92次方并找出其除以100的余数。 首先,我们导入了必要的包`java.math.BigInteger`和`java.math.BigDecimal`。`BigInteger`用于大数运算,而`BigDecimal`通常用于高精度的浮点数运算,虽然在这个例子中并未使用到。 在`test100`类中,定义了两个静态变量`k`和`j`,分别初始化为1和91,这两个变量都是`BigInteger`类型。此外,还定义了一个静态变量`n`用于存储除法运算后的余数,以及一个表示100的`BigInteger`对象`m`。 `main`方法是程序的入口点,这里首先将`k`设置为1,然后通过一个循环来计算91的92次方。循环中,每次迭代都使用`multiply()`方法将`k`乘以`j`,并将结果更新回`k`。在每次乘法运算后,使用`toString()`方法打印出当前的乘积。 接着,使用`remainder()`方法计算`k`除以100的余数,并将结果赋值给`n`,同样打印出余数。`remainder()`方法是`BigInteger`类的一个重要方法,它返回两数相除后的余数。 注意,在代码的最后有一段与大数运算练习无关的`BigIntegerGet`类,这个类包含了一些基本的大数加法和减法操作,但在这个特定的练习中并不需要。 通过这段代码,我们可以学习到`BigInteger`类的使用方法,包括创建`BigInteger`对象、进行乘法运算以及取余操作。这有助于我们在实际开发中处理需要进行大数运算的场景,例如在密码学、金融计算或科学计算等领域。

改正下面C#的代码错误public partial class Form7 : Form { private BigInteger p, q, n, phi_n, e, d; public Form7() { InitializeComponent(); } private void Form7_Load(object sender, EventArgs e) { GenerateKeys(); } private void GenerateKeys() { // 选择两个质数p和q string string1, string2; Int64 n, p, q, phi_n, e; p = BigInteger.Parse("12347534159895123"); q = BigInteger.Parse( "987654321357159852"); n = p * q; phi_n = (p - 1) * (q - 1); // 选择e并计算d e = 65537; d = ModInverse(e, phi_n); publicKeyTextBox.Text = $"{n} {e}"; privateKeyTextBox.Text = $"{n} {d}"; } private BigInteger ModInverse(BigInteger e, long phi_n) { throw new NotImplementedException(); } // 加密函数 private string Encrypt(string message, BigInteger n, BigInteger e) { BigInteger m = StrToBig(message); BigInteger c = BigInteger.ModPow(m, e, n); return BigToStr(c); } // 解密函数 private string Decrypt(string ctext, BigInteger n, BigInteger d) { BigInteger c = StrToBig(ctext); BigInteger m = BigInteger.ModPow(c, d, n); return BigToStr(m); } // 字符串转换为大整数 private BigInteger StrToBig(string str) { byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str); return new BigInteger(bytes); } // 大整数转换为字符串 private string BigToStr(BigInteger big) { byte[] bytes = big.ToByteArray(); return System.Text.Encoding.Unicode.GetString(bytes); } // 计算模反元素 private BigInteger ModInverse(BigInteger a, BigInteger m) { BigInteger x, y; ExtendedGCD(a, m, out x, out y); return x; } // 扩展欧几里得算法 private void ExtendedGCD(BigInteger a, BigInteger b, out BigInteger x, out BigInteger y) { if (b == 0) { x = 1; y = 0; } else { ExtendedGCD(b, a % b, out y, out x); y -= a / b * x; } } private void encryptButton_Click(object sender, EventArgs e) { string message = inputTextBox.Text; string ctext = Encrypt(message, n, e); outputTextBox.Text = ctext; } private void decryptButton_Click(object sender, EventArgs e) { string ctext = outputTextBox.Text; string message = Decrypt(ctext, n, d); outputTextBox.Text = message; } } }

2023-06-12 上传