Я пытаюсь выполнить факторизацию Диксона в Java, используя списки мощности, как описано в Википедии.Вот мой код для факторизации Диксона:
public static void DixonFactor(int n){
int a,nbSquares=0,factor1,factor2;
Map<Integer,List> pair_list = new HashMap<Integer,List>();
List<Integer> powerList;
// Iterate until we find 2 square numbers
while (nbSquares<2 ){
int x = (int) (Math.random()* ((n - Math.sqrt(n)) + 1 + Math.sqrt(n)));
a = (x*x)%n;
if (!isBsmooth(a, 7) || (primeFactors(a).get(primeFactors(a).size()-1)>7)) {continue;}
else{
System.out.println("x = "+x + " a = "+a);
powerList = generatePowerSet(a, 7);
if (isEvenList(powerList)) {nbSquares++;;continue;}
else{
pair_list.put(x, powerList);
// Combine all power lists and check if we can produce an even power list
if (pair_list.size()>1){ // Combined list has multiple elements
List<Integer> tempList = new ArrayList<>();tempList.add(0);tempList.add(0);tempList.add(0);tempList.add(0);
int product=1;
Set entrySet = pair_list.entrySet();
for(List<Integer> vals :pair_list.values()){
tempList = addLists(vals, tempList);
System.out.println("temp list :"+tempList);
}
for (Integer in:pair_list.keySet()){
product= product*in;
}
if (isEvenList(tempList)) {nbSquares++;break;}
else{
pair_list.put(product, tempList);
}
}
}
}
}
System.out.println(pair_list);
}
- Функция "isBsmooth" сообщает, является ли "a" гладкой 7
- Функция "primeFactors" возвращает список простых факторовиз "a" (допустимо меньше 7 факторов)
- generatePowerSet возвращает powerList
- AddLists добавляет два списка в виде добавления вектора
- isEven список сообщает, является ли список четным(содержит все четные числа)
Я применяю алгоритм, поэтому в основном я объединяю powerlist и проверяю, получаю ли я четный список, затем рассматриваю его как квадрат и разрыв;Я не мог заставить его работать после многих попыток, и функция печати не дает желаемых результатов.