文章目录
前言
本篇文章仅作参考,编者编写时对java还不是十分熟悉,可能有许多需要改进的地方,有错误可以在评论区指出。
一、实验原理
大数指的是超过计算机CPU寄存器表达的数,即超过计算机字长的数。大数基本运算主要指的是对大数进行数论运算,如加、减、乘、除。出于效率原因,一般的大数运算主要指对无符号类型的数进行数论计算。
目前主流RSA算法都建立在512位到1024位的大数运算之上。然而大多数的编译器只能支持到64位的整数运算,即运算中整数必须小于等于64位,即:0xFFFFFFFFFFFFFFFF,这远远达不到RSA的需要,于是需要建立专门的大数运算库来解决这一问题。
最简单的办法是将大数当作字符串处理,也就是将大数用10进制字符数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。但是这样做效率很低,因为1024位的大数其10进制数字个数就有数百个,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进位退位标志及中间结果。其优点是算法符合人们的日常习惯,易于理解。
另一种方法是将大数当作一个二进制流进行处理,使用各种移位和逻辑操作来进行加减乘除运算,但是这样做代码设计非常复杂,可读性很低,难以理解也难以调试。
二、解释
本实验简单来说就是,我们要实现超级大整数(比如:786734816284961648126128646124124)的计算,因为像这样的整数即便是使用long long
类型也不可能存储下来,所以我们采用字符串将数据保存下来,然后再进行运算。具体算法我们参考课本上的来就可以了。
三、算法参考
算法1.5.1 多精度数加法
输入:正整数 x x x和 y y y,长度为 n + 1 n+1 n+1,基为 b b b
输出:和 x + y x+y x+y的 b b b进制表示 x + y = ( w n + 1 w n . . . w 1 w 0 ) x+y=(w_ {n+1}w_n...w_1w_0) x+y=(wn+1wn...w1w0)
1. c ← 0 c\leftarrow 0 c←0( c c c是进位数)
2. i i i从 0 0 0到 n n n执行
如果 ( x i + y i + c ) < b (x_i+y_i+c)<b (xi+yi+c)<b,则 w i ← x i + y i + c w_i\leftarrow x_i+y_i+c wi←xi+yi+c, c ← 0 c\leftarrow 0 c←0,否则 w i ← x i + y i + c − b w_i\leftarrow x_i+y_i+c-b wi←xi+yi+c−b, c ← 1 c\leftarrow 1 c←1
3. w n + 1 ← c w_{n+1}\leftarrow c wn+1←c
4.返回 ( w n + 1 w n . . . w 1 w 0 ) (w_{n+1}w_n...w_1w_0) (wn+1wn...w1w0)
算法1.5.2 多精度数减法
输入:正整数 x x x和 y y y,长度为 n + 1 n+1 n+1,基为 b b b,并且 x ≥ y x\geq y x≥y
输出:差 x − y x-y x−y的 b b b进制表示
1. c ← 0 c\leftarrow 0 c←0( c c c是进位数)
2. i i i从 0 0 0到 n n n执行
如果 ( x i − y i + c ) ≥ 0 (x_i-y_i+c)\geq 0 (xi−yi+c)≥0 ,则 w i ← x i − y i + c w_i\leftarrow x_i-y_i+c wi←xi−yi+c, c ← 0 c\leftarrow 0 c