В Java не работает присваивание

Пишу решатель матриц простых дробей методом Жордана-Гаусса. Программа просто зависает на вычислении элемента матрицы с помощью метода прямоугольника, при использовании дебаггера Intalij IDEA бесконечно идёт сбор данных моего объекта, причём происходит это именно на моменте присваивания значения элементу матрицы (now[i][j] = last[i][j].minus(temp); Это файл Gaus.java, цикл с комментарием "всё остальное"). Пробовал обновить JDK и пускать код на другой системе, но результатов не дало. Это вообще как-то фикситься или проще писать на другом языке?

Gaus.java

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.Scanner;

public class Gaus {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner fileScanner = new Scanner(new File("file.txt"));
        SimpleFraction[][] last = new SimpleFraction[fileScanner.nextInt()][fileScanner.nextInt()];
        SimpleFraction[][] now = new SimpleFraction[last.length][last[0].length];
        String[] s;
        SimpleFraction num, temp;
        for(int i = 0; i < last.length; i++){
            for(int j = 0; j < last[0].length; j++){
                s = fileScanner.next().split("/");
                if(s.length == 1){
                    last[i][j] = new SimpleFraction(Integer.parseInt(s[0]));
                } else{
                    last[i][j] = new SimpleFraction(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
                }
            }
        }
        for(int k = 0; k < last.length; k++){
            if(!last[k][k].isNull()){
                printMatrix(last);
                num = last[k][k];
                for(int i = 0; i < last[0].length; i++){ // строка с опорным элементом
                    now[k][i] = last[k][i].div(num);
                }
                for(int j = 0; j < last.length; j++){ // столбец с опорным элементом
                    if(j != k){
                        now[j][k] = new SimpleFraction(0);
                    }
                }
                for(int i = 0; i < last.length; i++){ // всё остальное
                    if(i != k) {
                        for (int j = k + 1; j < last[0].length; j++) {
                            temp = last[i][k].multi(last[k][j]).div(num);
                            now[i][j] = last[i][j].minus(temp);
                        }
                    }
                }
                last = now;
            }
        }
        for (SimpleFraction[] simpleFractions : last) {
            if (Arrays.stream(simpleFractions).limit(last[0].length - 1).allMatch(SimpleFraction::isNull)) {
                System.out.println("Нет решений!");
                return;
            }
        }
        for(int i = 0, j = 0; i < last.length; i++){
            while (last[i][j].isNull()){
                j++;
            }
            System.out.printf("x%d = %s", j, last[i][last.length - 1].toString());
            while(j < last.length - 1){
                if (!last[i][j].isNull()) {
                    last[i][j].inversion();
                    System.out.print(last[i][j]);
                }
                j++;
            }
            System.out.println();
        }
    }

    private static void printMatrix(SimpleFraction[][] matrix){
        for(SimpleFraction[] arr: matrix){
            System.out.println(Arrays.toString(arr));
        }
        System.out.println("----------------------------");
    }
}

PrimeNumber.java

import java.util.LinkedList;
import java.util.List;

public class PrimeNumber {
    private static int limit = 3;
    private static final LinkedList<Integer> prime = new LinkedList<>(List.of(2, 3));

    public static LinkedList<Integer> primeDivisors(int number){
        if(number > limit){
            count(number);
        }
        LinkedList<Integer> result = new LinkedList<>();
        if(number != 0) {
            while (Math.abs(number) != 1) {
                for (int p : prime) {
                    if (number % p == 0) {
                        number /= p;
                        result.add(p);
                        break;
                    }
                }
            }
        }
        return result;
    }

    private static void count(int newLimit){
        boolean flag;
        for(int i = limit + 1; i <= newLimit; i++){
            flag = true;
            for(int p: prime){
                if(i % p == 0){
                    flag = false;
                    break;
                }
            }
            if(flag){
                prime.add(i);
            }
        }
        limit = newLimit;
    }
}

SimpleFraction.java

public class SimpleFraction {
    private int nominator;
    private int denominator;

    public SimpleFraction(int n, int d){
        nominator = n;
        denominator = d;
    }

    public SimpleFraction(int number){
        nominator = number;
        denominator = 1;
    }

    public SimpleFraction(SimpleFraction other){
        nominator = other.nominator;
        denominator = other.denominator;
    }

    private void toOneDenominator(SimpleFraction other){
        if(other.nominator != 0) {
            int d = other.denominator;
            for (int n : PrimeNumber.primeDivisors(denominator)) {
                if (d % n == 0) {
                    d /= n;
                }
            }
            int resultDenominator = d * denominator;
            nominator *= resultDenominator / denominator;
            other.nominator *= resultDenominator / other.denominator;
            denominator = resultDenominator;
            other.denominator = resultDenominator;
        }
    }

    public void inversion(){
        nominator *= -1;
    }

    public SimpleFraction multi(SimpleFraction other){
        SimpleFraction now = new SimpleFraction(this);
        now.nominator *= other.nominator;
        now.denominator *= other.denominator;
        return now;
    }

    public SimpleFraction div(SimpleFraction other){
        SimpleFraction now = new SimpleFraction(this);
        now.nominator *= other.denominator;
        now.denominator *= other.nominator;
        return now;
    }

    public SimpleFraction plus(SimpleFraction other){
        SimpleFraction oth = new SimpleFraction(other);
        SimpleFraction now = new SimpleFraction(this);
        now.toOneDenominator(oth);
        int n = now.nominator;
        int o = other.nominator;
        return new SimpleFraction(n + o, now.denominator);
    }

    public SimpleFraction minus(SimpleFraction other){
        SimpleFraction oth = new SimpleFraction(other);
        SimpleFraction now = new SimpleFraction(this);
        now.toOneDenominator(oth);
        int n = now.nominator;
        int o = other.nominator;
        return new SimpleFraction(n - o, now.denominator);
    }

    public boolean isNull(){
        return nominator == 0;
    }

    @Override
    public String toString() {
        int nom = nominator;
        int den = denominator;
        for(int n: PrimeNumber.primeDivisors(nom)){
            if(den % n == 0){
                nom /= n;
                den /= n;
            }
        }
        return (den == 1 || nom == 0? Integer.toString(nom) : nom + "/" + den);
    }
}

Ответы (0 шт):