private List<BigInteger> factorize(BigInteger n){
		List<BigInteger> factors = new LinkedList<BigInteger>();
		BigInteger a = BigInteger.valueOf(2);
		Boolean test_n_if_prime=true;
		do {
			if(n.remainder(a).equals(BigInteger.ZERO)) {factors.add(a); test_n_if_prime=true;}
			while(n.remainder(a).equals(BigInteger.ZERO)) n=n.divide(a);
			if(test_n_if_prime && n.isProbablePrime(100)) break;
			test_n_if_prime=false;
			a=a.nextProbablePrime();
			if(a.compareTo(BigInteger.valueOf(20000l))>0) return null;
		}while(a.multiply(a).compareTo(p)<0);
		if(!n.equals(BigInteger.ONE))factors.add(n);
		return factors;
	}