`
zqc53
  • 浏览: 26270 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

算法3:计算超大数字整数乘法

阅读更多
还不能处理负数和小数点

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();
    
分享到:
评论
1 楼 清风车影 2009-10-29  
convert方法呢?程序跑不起来.

相关推荐

    RSA算法优化

    它在信息安全领域扮演着至关重要的角色,广泛应用于数据加密、数字签名和密钥交换。本文将深入探讨RSA算法的核心原理及其优化实现。 RSA算法基于数论中的两个核心概念:大数分解和欧拉函数。其安全性基于大整数因数...

    KaratsubaAlgorithm-master.rar

    1. 大整数计算:在处理大整数乘法时,Karatsuba算法可以大大提高计算效率,尤其在密码学、加密解密、数字证书验证等领域,需要频繁进行大整数的运算。 2. 计算机科学竞赛:在编程竞赛中,当题目涉及大整数乘法时,...

    RSA算法1024位C语言实现

    6. 证书和数字签名:RSA还可以用于创建和验证数字签名,以确保数据的完整性和发送者的身份。这通常涉及到对消息的哈希值进行加密和解密。 7. 错误检查和异常处理:在实际实现中,还需要考虑错误处理,如确保输入的...

    python 实现RSA算法

    RSA(Rivest–Shamir–Adleman)是一种非对称加密算法,广泛应用于网络安全领域,如数据加密、数字签名等。它的主要特点是使用一对密钥,即公钥和私钥,公钥用于加密,私钥用于解密。这种特性使得RSA在保护信息安全...

    计算机密码学考试试卷

    CA生成包含用户公钥和个人信息的数字证书。 4. CA用自己的私钥对证书进行数字签名。 5. CA将签发后的证书返回给用户。 - **X.509证书主要项目**: - 版本信息 - 序列号 - 签名算法标识符 - 发证机构名称 - ...

    密码学代码完整版密码学代码完整版

    8. **蒙哥马利乘法**:在大数运算中,尤其是RSA计算,蒙哥马利乘法是一种优化技术,它简化了模乘法的过程,减少了除法操作,提高了效率,尤其适用于硬件实现。 9. **PKCS#7**:PKCS(Public-Key Cryptography ...

    VC实现的RSA算法

    - 找到一个整数d,使得d*e ≡ 1 (mod φ(n)),即d是e在模φ(n)下的乘法逆元,这一步骤可以通过扩展欧几里得算法完成。 - 公钥是(e, n),私钥是(d, n)。 2. **加密过程**: - 明文m(0)通过公式c=m^e (mod n)...

    RSA.zip_RSA算法_数据算法

    这种算法在信息安全领域扮演着重要角色,广泛应用于数字签名、安全通信等领域。在本文中,我们将深入探讨RSA算法的核心原理、实现过程以及其在数据加解密中的应用。 RSA算法基于两个核心数学概念:大整数因子分解和...

    d-h_DH算法_

    为防止这种攻击,通常会结合数字签名或证书来验证身份。此外,随着计算能力的提升,原本认为安全的p和g可能变得不再安全,因此需要定期更新这些参数。 DH算法广泛应用于各种网络安全协议中,如SSL/TLS协议,以及...

    (精品word)网络安全RSA算法的实现实验报告.doc

    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"这个文件名可能是指实现了大整数乘法的一个程序或库。在实际编程中,可以使用各种...

    结课报告1

    数字证书则包含公开密钥和身份信息,由可信机构签名,用于验证身份和保证通信安全。 7. 彩虹表构造: 彩虹表是一种优化的预计算表,用于破解哈希函数。设计和实现彩虹表时,需要理解减少函数(Reduction Function...

    网络安全RSA算法的实现实验报告.pdf

    加密连接、数字签名和数字证书的核心算法广泛使用 RSA。 二、算法原理 1. 选择两个不同的大素数 p、q (目前两个数的长度都接近 512bit 是安全的); 2. 计算 n = p*q。 3. 计算 n 的欧拉函数 t=(p-1)(q-1)。 4. ...

    信息安全认证习题参考答案.doc

    这份文档似乎是一份关于信息安全认证的练习题及参考答案,涵盖了多个章节的知识点,包括数论基础、密码学中的经典算法(如DES、RSA)、消息认证、数字签名以及网络安全协议如SSL和Kerberos。这些知识点在信息安全...

    加密解密算法 DES RSA

    CA负责验证并签发数字证书,这些证书包含了公钥和拥有者的身份信息。在RSA的上下文中,CA的证书可以帮助确保公钥的来源可信,防止中间人攻击。 在学习这些加密算法时,理解它们的基本原理和实现细节至关重要。C语言...

    RSA快速算法的研究

    RSA算法在实际应用中,如网上交易、网上银行身份验证、数字证书和智能设备的身份验证等方面都有广泛使用。例如,SET(Secure Electronic Transactions)标准就采纳了RSA算法,确保了电子支付的安全。此外,RSA还作为...

    计算机专业英语词汇软考常用词汇

    26. Certificates:证书,指计算机中的数字证书,例如SSL证书、代码签名证书等。 27. Command:命令、指令,指计算机中的操作命令,例如dos命令、shell命令等。 28. Compress:压缩、精减,指计算机中的数据压缩...

    RSA加密源代码 c语言编写 可运行

    - 数字证书:在PKI(Public Key Infrastructure)系统中,RSA用于生成和验证数字签名。 - 文件加密:对重要文件进行加密,防止未授权访问。 通过阅读和理解这个C语言编写的RSA加密源代码,不仅可以深入学习RSA...

Global site tag (gtag.js) - Google Analytics