diff --git a/Main.java b/Main.java index 53cb448..5cd6a67 100644 --- a/Main.java +++ b/Main.java @@ -1,44 +1,38 @@ +import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { - int n; - if (args.length < 1) { - n = -1; - Scanner scanner = new Scanner(System.in); - while (n < 2) { - System.out.print("n = "); - n = scanner.nextInt(); - } - } else { n = Integer.parseInt(args[0]); } + int mod = Integer.parseInt(args[0]); + Polynomials poly = new Polynomials(mod); + ArrayList f = new ArrayList<>(); + ArrayList g = new ArrayList<>(); - Ring r = new Ring(n); + String[] tmpString = args[1].split(","); + String[] tmpString2 = args[2].split(","); - r.wyznaczOdwracalne(); - r.wyznaczDzielniki(); - r.wyznaczNil(); - r.wyznaczId(); + for (String s : tmpString){ + f.add(Integer.parseInt(s)); + } + for (String s : tmpString2){ + g.add(Integer.parseInt(s)); + } - System.out.println("elementy odwracalne (" + r.odwracalne.size() + "):"); - for (int i: r.odwracalne) { - System.out.print(i + ", "); + System.out.print("["); + for (int i : poly.multiply(f, g)){ + System.out.print(i + " "); } - System.out.println(); - System.out.println("dzielniki zera (" + r.dzielniki.size() + "):"); - for (int i: r.dzielniki) { - System.out.print(i + ", "); + System.out.print("], ["); + for (int i : poly.divModN(f, g)){ + System.out.print(i + " "); } - System.out.println(); - System.out.println("elementy nilpotentne (" + r.nilpotentne.size() + "):"); - for (int i: r.nilpotentne) { - System.out.print(i + ", "); - } - System.out.println(); - System.out.println("elementy idempotentne (" + r.idempotentne.size() + "):"); - for (int i: r.idempotentne) { - System.out.print(i + ", "); + System.out.print("], ["); + for (int i : poly.gcc(f, g)){ + System.out.print(i + " "); } + System.out.print("]"); + } -} +} \ No newline at end of file diff --git a/Polynomials.java b/Polynomials.java new file mode 100644 index 0000000..8539083 --- /dev/null +++ b/Polynomials.java @@ -0,0 +1,99 @@ +import java.util.ArrayList; + +public class Polynomials { + int n; + + public Polynomials(int n) { + this.n = n; + } + + private ArrayList normalize(ArrayList w){ + for (int i = w.size()-1; i >= 0; --i){ + if (w.get(i).equals(0)) { + w.remove(i); + }else { + return w; + } + } + return w; + } + + public ArrayList multiply(ArrayList f, ArrayList g){ + ArrayList result = new ArrayList<>(); + int tmp; + + for (int i = 0; i < f.size(); ++i){ + for (int j = 0; j < g.size(); ++j){ + tmp = f.get(i) * g.get(j); + if (i + j < result.size()){ + tmp += result.get(i+j); + result.set(i + j, tmp % n); + } else { + while ((i + j) >= (result.size())){ + result.add(0); + } + result.set(i + j, tmp % n); + } + } + } + return normalize(result); + } + + private int getZero(int a, int b) throws ArithmeticException{ + for (int i = 0; i <= n; ++i){ + if ((a + (-(b * i))) == 0) return i; + } + throw new ArithmeticException("not reversible"); + } + + public ArrayList multiplyByConst(ArrayList f, Integer a){ + ArrayList result = new ArrayList<>(); + for (Integer i : f){ + result.add((i * a) % n); + } + return result; + } + + public ArrayList subtract(ArrayList f, ArrayList g){ + ArrayList result = new ArrayList<>(); + for (int i = 0; i < f.size(); ++i){ + if (i < g.size()){ + result.add(Math.floorMod(f.get(i) - g.get(i), n)); + } else{ + result.add(f.get(i)); + } + } + return result; + } + + public ArrayList divModN(ArrayList f, ArrayList g) throws ArithmeticException{ + ArrayList quotient = new ArrayList<>(); + ArrayList remainder = new ArrayList<>(f); + ArrayList tmpList; + int a = f.size() - 1; + int b = g.size() - 1; + + for (int i = 0; i < a - b + 1; ++i){ + quotient.add(0); + } + + int q = quotient.size()-1; + int tmp; + while (a >= b) { + tmp = getZero(remainder.get(a), g.get(b)); + quotient.set(q--, tmp); + tmpList = multiplyByConst(g, tmp); + while(tmpList.size() <= a) tmpList.add(0,0); + remainder = subtract(remainder, tmpList); + --a; + } + return normalize(remainder); + } + + public ArrayList gcc (ArrayList f, ArrayList g){ + if (g.size() == 0) return f; + if (f.size() > g.size()){ + return gcc(g, divModN(f, g)); + } else return gcc(g, divModN(g, f)); + } +} \ No newline at end of file