基于数论变换的大整数乘法Java代码实现

前段时间看了算法导论上关于FFT的那一章,突发奇想:能不能用这种方法实现大整数的乘法呢?经过自己的思考,以及网上查找资料,得出了一个不算完美的方案,但是也能够处理上千位的大整数之间的乘法了。其实对应于FFT,在整数多项式中早就有人提出了数论变换。上代码:


package NumericTransformation;

import java.awt.Color;
import java.awt.Graphics;
import java.math.BigInteger;
import java.util.Random;
import java.util.Scanner;

/**
 * 实现了基于数论变换的大整数乘法
 * @author wwf
 *
 */

public class NumericTransformation {

	public static final int M=65537;
	public static final int R=3;//3 是65537的一个本原根,也可以说是生成元
	public static final int RP=21846;
	public static final int MAX_POW=65536;
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Scanner in=new Scanner(System.in);
		/*System.out.println("input two integer numbers : ");
		String numa=in.next();
		String numb=in.next();
		System.out.println("the result of multiplication is : "+new NumericTransformation().multiply(numa, numb));
		*/
		
	}
	
	void testOnce(int length,int position,Graphics g) throws Exception{
		
		long time1=0,time2=0;
		System.out.println("calculate");
		for(int i=0;i<500;i++){
			
			Random rand=new Random();
			StringBuffer sba=new  StringBuffer();
			StringBuffer sbb=new StringBuffer();
			for(int j=0;j1){
				result.delete(0, 1);
			}
			return result.toString();
		}else if(a.startsWith("-")){
			return "-"+multiply(a.substring(1), b);
		}else{
			return "-"+multiply(a, b.substring(1));
		}
		
	}
	

	/**
	 * a和b是两个乘数的十进制表示形式(两个乘数都是非负整数)
	 * @param a
	 * @param b
	 * @return
	 * @throws Exception
	 */
	private long[] numMultiply(long []a,long[] b) throws Exception{
		if(a.length*81>M&&b.length*81>M){
			throw new Exception("number too large to perform FFT based Multiplication");
		}
		
		long[] result=polyMultiply(a, b);
		/*for(int i=0;i=0;i--){
			if(result[i]>10){
				result[i-1]+=result[i]/10;
				result[i]%=10;
			}
		}
		/*for(int i=0;i



你可能感兴趣的:(java,exception,string,fft,integer,numbers)