В 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);
}
}