public static BigInt koMul(BigInt A, BigInt B) {
	  	System.out.print("A: ");
	  	A.print();
	  	System.out.print("B: ");
	  	B.print();
	  	
	  	System.out.println("A.length: " + A.length());
	  	System.out.println("B.length: " + B.length());
	  	
	  	
	  	int n = Math.max(A.length(), B.length());
	  	System.out.println("n: " + n);		
	  	
		if (n == 1) {
			DigitCarry dc =  Arithmetic.mulDigits(A.getDigit(0), B.getDigit(0));
			BigInt result = new BigInt(1);
			result.setDigit(0, dc.digit());
			if(dc.carry().intValue() != 0) {
				result.lshift(1);
				result.setDigit(0, dc.carry());	
			}
			System.out.print("result: ");
			result.print();
			return result;
		}
	  
		//A.lshift(n-A.length());
		//B.lshift(n-B.length());
		
		
		int nfloor = n/2;
		if (n%2>0) {
			nfloor = n/2 +1;
		}
		int nceiling = nfloor -1;
		
		
		System.out.println("ceiling: " + nceiling);
		System.out.println("floor: " + nfloor);
		System.out.println("n-1: " + (n-1));
		
		BigInt a0 = A.split(nfloor, n-1);	
		BigInt a1 = A.split(0, nceiling);
		
		System.out.print("a0: ");
		a0.print();
		System.out.print("a1: ");
		a1.print();
		
		BigInt b0 = B.split(nfloor, n-1);
		BigInt b1 = B.split(0, nceiling);
		
		System.out.print("b0: ");
		b0.print();
		System.out.print("b1: ");
		b1.print();
	  
		BigInt l = koMul(a0, b0);
		System.out.print("l: ");
		l.print();
		BigInt h = koMul(a1, b1);
		System.out.print("h: ");
		h.print();
		BigInt atimesb = koMul(add(a0, a1), add(b0, b1));
		BigInt lplush = add(l, h);
		BigInt m = sub(atimesb, lplush);
		System.out.print("m: ");
		m.print();
		BigInt mB = new BigInt((m.length() + nfloor));
		BigInt hB = new BigInt(2*((h.length() + nfloor)));
		Unsigned zero = new Unsigned(0);
		for (int i = 0; i < mB.length(); i++) {
			if (i<m.length()) {
				mB.setDigit(i, m.getDigit(i));
			}
			else {
				mB.setDigit(i, zero);
			}
		}
		for (int i = 0; i < 2*hB.length(); i++){
			if (i<h.length()) {
				hB.setDigit(i, h.getDigit(i));
			}
			else {
				hB.setDigit(i, zero);
			}
		} 
		BigInt output = add(add(m, h), l);
		return output;  
	  
	  	  
  }