`
- 浏览:
26270 次
-
还不能处理负数和小数点
package s1;
import java.util.Stack;
import java.util.Vector;
/** *//**
* A multiply simulation
* for example :
* 56 X 67 =
*
* 56
* x 67
* ----------
* 392
* 336
*------------
* 3752
*
* So ,in this way,We can calculation very very big number,for example: 299^133 etc.
*
* @author Urashima
*
*/
public class BigNumberMultiply extends BaseNumberOperation{
//each array indicates a param
private Integer[] paramFirst,paramSecond;
//main method
public String calculate(String param1,String param2){
paramFirst = convert(param1);
paramSecond = convert(param2);
//multiply each bit,from low to high
int indexFirst = paramFirst.length - 1;
int indexSecond = paramSecond.length - 1;
//multiply results for each bit
Vector<Integer[]> branchResults = new Vector<Integer[]>();
for(;indexSecond > -1;indexSecond--){
branchResults.add(branchMultiply(paramFirst,paramSecond[indexSecond]));
}
String finalResult = branchAddTogether(branchResults);
return finalResult;
}
private Integer[] branchMultiply(Integer[] upper,Integer down){
Stack<Integer> results = new Stack<Integer>();
//todo : all core gose here
int carryFlag = 0;
for(int index = upper.length-1 ;index > -1;index--){
int r1 = down;
int r2 = upper[index];
int r0 = r1 * r2 + carryFlag;
carryFlag = (int)(r0/10);
int r3 = r0 - ( 10 * carryFlag );
if(index!=0)
results.push(r3);
else
results.push(r0);
}
//sorts out and return
Integer[] branchResult = new Integer[results.size()];
results.toArray(branchResult);
//System.out.println (branchResult.toString());
return branchResult;
}
private String branchAddTogether(Vector<Integer[]> v){
Vector<String> params = new Vector<String>();
//TODO: fix bug#001
int bi = 0;
for(Integer[] pps : v){
//revers pps
Integer[] rpps = new Integer[pps.length];
System.arraycopy(pps,0,rpps,0,pps.length);
for(int k = pps.length-1 ; k > -1 ; k-- ){
rpps[pps.length-1-k] = pps[k];
}
v.set(bi++,rpps);
}
//sort out data,add increamental 0 to each bit
for(Integer[] ii : v){
String pa = "";
for(Integer i : ii){
pa += i;
}
params.add(pa);
}
int incr = 0;
for(int idx = 0 ; idx < params.size(); idx ++){
String s = params.get(idx);
for(int i = 0 ; i < incr ; i ++){
s += "0";
}
params.set(idx,s);
//System.out.println (s);
incr++;
}
//convert back to int[]
for(int i = 0 ; i < params.size();i++){
String ctt = params.get(i);
//System.out.println (ctt);
v.set(i,convert(ctt));
}
//add them together
Stack<Integer> result;
//trim right and add
result = trimRightAdd(v);
StringBuffer sb = new StringBuffer();
try{
while(true)
sb.append(result.pop());
}catch(Exception e){
//pass,ignore.
}
return sb.toString();
}
private Stack<Integer> trimRightAdd(Vector<Integer[]> params){
Stack<Integer> result = new Stack<Integer>();
int carry = 0;
int maxBit = 0;
//todo:maxbit
for(Integer[] i : params){
int il = i.length;
maxBit = il > maxBit?il:maxBit;
}
//bit moving , from low to higth
int indexDecreaseCount = 1;
int columnValue = 0;
int bitValue = 0;
for(int k = 0 ; k < maxBit; k++){
if(k > 0){
result.push(bitValue);
columnValue = 0;
bitValue = 0;
}
//value of each column,including carry
int num = 0;
for(Integer[] param : params){
int index = param.length - indexDecreaseCount;
try{
num = param[index];
}catch(Exception e){
num = 0;
}
//TODO: may be simulation calculate is better here
columnValue += num;
}
//first bit
if(k != maxBit-1 ){
columnValue += carry;
carry = (int)(columnValue/10);
bitValue = columnValue - ( 10 * carry );
indexDecreaseCount ++;
}else{
columnValue += carry;
result.push(columnValue);
}
}
return result;
}
} 测试计算结果
package s1;
public class Demo{
private TwoNumberOperation operatorMultiply = new BigNumberMultiply();
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
它在信息安全领域扮演着至关重要的角色,广泛应用于数据加密、数字签名和密钥交换。本文将深入探讨RSA算法的核心原理及其优化实现。 RSA算法基于数论中的两个核心概念:大数分解和欧拉函数。其安全性基于大整数因数...
1. 大整数计算:在处理大整数乘法时,Karatsuba算法可以大大提高计算效率,尤其在密码学、加密解密、数字证书验证等领域,需要频繁进行大整数的运算。 2. 计算机科学竞赛:在编程竞赛中,当题目涉及大整数乘法时,...
6. 证书和数字签名:RSA还可以用于创建和验证数字签名,以确保数据的完整性和发送者的身份。这通常涉及到对消息的哈希值进行加密和解密。 7. 错误检查和异常处理:在实际实现中,还需要考虑错误处理,如确保输入的...
RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,广泛应用于网络安全领域,如数据加密、数字签名等。它的主要特点是使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。这种特性使得RSA在保护信息安全...
CA生成包含用户公钥和个人信息的数字证书。 4. CA用自己的私钥对证书进行数字签名。 5. CA将签发后的证书返回给用户。 - **X.509证书主要项目**: - 版本信息 - 序列号 - 签名算法标识符 - 发证机构名称 - ...
8. **蒙哥马利乘法**:在大数运算中,尤其是RSA计算,蒙哥马利乘法是一种优化技术,它简化了模乘法的过程,减少了除法操作,提高了效率,尤其适用于硬件实现。 9. **PKCS#7**:PKCS(Public-Key Cryptography ...
- 找到一个整数d,使得d*e ≡ 1 (mod φ(n)),即d是e在模φ(n)下的乘法逆元,这一步骤可以通过扩展欧几里得算法完成。 - 公钥是(e, n),私钥是(d, n)。 2. **加密过程**: - 明文m(0)通过公式c=m^e (mod n)...
这种算法在信息安全领域扮演着重要角色,广泛应用于数字签名、安全通信等领域。在本文中,我们将深入探讨RSA算法的核心原理、实现过程以及其在数据加解密中的应用。 RSA算法基于两个核心数学概念:大整数因子分解和...
为防止这种攻击,通常会结合数字签名或证书来验证身份。此外,随着计算能力的提升,原本认为安全的p和g可能变得不再安全,因此需要定期更新这些参数。 DH算法广泛应用于各种网络安全协议中,如SSL/TLS协议,以及...
5. 用欧几里得算法计算 d 作为私钥,使 d*e=1 mod t。 6. 加密:C=M^e mod n 7. 解密:M=C^d mod n=(M^e)^d mod n= M^e^d mod n。 三、RSA 算法的各环节 RSA 算法是 1978 年由 R.L.Rivest,A.Sharmir 和 L....
3. 数值计算:科学计算和工程应用中,大整数乘法是必不可少的,比如在计算圆周率或模拟物理现象时。 五、编程实现 "int_multifly"这个文件名可能是指实现了大整数乘法的一个程序或库。在实际编程中,可以使用各种...
数字证书则包含公开密钥和身份信息,由可信机构签名,用于验证身份和保证通信安全。 7. 彩虹表构造: 彩虹表是一种优化的预计算表,用于破解哈希函数。设计和实现彩虹表时,需要理解减少函数(Reduction Function...
加密连接、数字签名和数字证书的核心算法广泛使用 RSA。 二、算法原理 1. 选择两个不同的大素数 p、q (目前两个数的长度都接近 512bit 是安全的); 2. 计算 n = p*q。 3. 计算 n 的欧拉函数 t=(p-1)(q-1)。 4. ...
这份文档似乎是一份关于信息安全认证的练习题及参考答案,涵盖了多个章节的知识点,包括数论基础、密码学中的经典算法(如DES、RSA)、消息认证、数字签名以及网络安全协议如SSL和Kerberos。这些知识点在信息安全...
CA负责验证并签发数字证书,这些证书包含了公钥和拥有者的身份信息。在RSA的上下文中,CA的证书可以帮助确保公钥的来源可信,防止中间人攻击。 在学习这些加密算法时,理解它们的基本原理和实现细节至关重要。C语言...
RSA算法在实际应用中,如网上交易、网上银行身份验证、数字证书和智能设备的身份验证等方面都有广泛使用。例如,SET(Secure Electronic Transactions)标准就采纳了RSA算法,确保了电子支付的安全。此外,RSA还作为...
26. Certificates:证书,指计算机中的数字证书,例如SSL证书、代码签名证书等。 27. Command:命令、指令,指计算机中的操作命令,例如dos命令、shell命令等。 28. Compress:压缩、精减,指计算机中的数据压缩...
- 数字证书:在PKI(Public Key Infrastructure)系统中,RSA用于生成和验证数字签名。 - 文件加密:对重要文件进行加密,防止未授权访问。 通过阅读和理解这个C语言编写的RSA加密源代码,不仅可以深入学习RSA...