diff --git a/App.java b/App.java new file mode 100644 index 0000000..33e4924 --- /dev/null +++ b/App.java @@ -0,0 +1,196 @@ +//package com.madrakrystian.algebra; + +import java.util.InputMismatchException; +import java.util.Scanner; +import java.util.Stack; + +public class App { + +// napisać algorytm, który dla danego n ∈ ℕ znajdzie wszystkie: +// +// elementy odwracalne +// dzielniki zera +// elementy nilpotentne +// elementy idempotentne +// w pierścieniu {ℤ/nℤ, +, ⋅}. + +// Przykłady: +// +// Input: 4 +// Output: [[1,3], [0,2], [0,2], [0,1]] +// +// Input: 6 +// Output: [[1,5], [0,2,3,4], [0], [0,1,3,4]] + + + // czytanie inputu z System.in + static Scanner reader = new Scanner(System.in); + + public static void main(String[] args) { + + // ograniczenie 1000 (!) + int number = 1; + + do{ + System.out.println("Enter a number (must be 0 1000 || number < 0); + + // nasza liczba + System.out.println("Input: " + number); + + /* for debug + System.out.println("1. Reversible numbers: " + reversible(number)); + + System.out.println("2. Zero divisors: " + zeroDivisors(number)); + + System.out.println("3. Nilpotent numbers: " + nilpotent(number)); + + System.out.println("4. Idempotent numbers: " + idempotent(number)); + */ + + // na potrzeby tworzenia programu potrzebna byla jakas dynamiczna struktura danych, po zrobieniu mozna zamienic w tablice + Stack> output = new Stack>(); + + // dodanie stosow do nadstosu (dla duzych liczb output staje sie nieczytelny - polecam odkomentowac "for debug") + output.push(reversible(number)); + output.push(zeroDivisors(number)); + output.push(nilpotent(number)); + output.push(idempotent(number)); + + // output taki jak w specyfikacji + System.out.println("Output: " + output); + + // zamkniecie reader'a + reader.close(); + } + + // algorytm nwd (pomocnicza funkcja) + public static int nwd(int a, int b) { + + while(a != b) { + if (a < b) { + b -= a; + } + else a -=b; + } + return a; + } + + // 1. elementy odwracalne + public static Stack reversible(int number) { + + Stack reversibleNumbers = new Stack(); + + int temp; + + for (int i = 1; i zeroDivisors(int number) { + + Stack zeroDivisors = new Stack(); + + // 0 (element neutralny dodawania) zawsze jest swoim dzielnikiem + zeroDivisors.push(0); + + int temp; + + for(int i = 1; i nilpotent(int number) { + + Stack nilpotentNumbers = new Stack(); + + // 0 (element neutralny dodawania) zawsze spelnia warunek nilpotentnosci + nilpotentNumbers.push(0); + + int temp, tempPow; + + for(int i = 2; i idempotent(int number) { + + Stack idempotentNumbers = new Stack(); + + // 0 (element neutralny dodawania) zawsze spelnia warunek idempotentnosci + idempotentNumbers.push(0); + + int temp; + + for(int i = 1; i p1 = new Stack(); + int polyTwo[]; + Stack p2 = new Stack(); + + // wspolczynnik n + int n=1; + + + String str; + String input; + + char temp; + + input = args[0]; + + BufferedReader read = new BufferedReader( + new StringReader(input)); + + // od poczatku pierwszego wielomianu '[' + int i = 3; + try { + if ((str = read.readLine()) != null) { + + if (str.length() > 0) { + n = Character.getNumericValue(str.charAt(0)); + } + temp = str.charAt(i); + while(temp != ']') { + + if(temp != ',') { + p1.push(Character.getNumericValue(temp)); + counterFirst++; + } + i++; + temp = str.charAt(i); + } + + // przejscie do drugiej tablicy (zakladamy ze wielomiany oddzielone sa spacja) + i += 3; + temp = str.charAt(i); + + while(temp != ']') { + + if(temp != ',') { + p2.push(Character.getNumericValue(temp)); + counterSecond++; + } + i++; + temp = str.charAt(i); + } + + // inicjalizacja tablic + polyOne = new int[counterFirst]; + polyTwo = new int[counterSecond]; + + // wypelnianie tablic + for(int j=polyOne.length-1; j>=0; j--) { + + polyOne[j] = p1.pop(); + } + + for(int j=polyTwo.length-1; j>=0; j--) { + polyTwo[j] = p2.pop(); + } + + + // wyswietl wielomiany + System.out.println("f:" + Arrays.toString(polyOne)); + System.out.println("g:" + Arrays.toString(polyTwo)); + + // 1. + System.out.println("1. iloczyn f*g: "); + int res[] = modTheTab(polynomialsMultiplication(polyOne, polyTwo),n); + System.out.println(Arrays.toString(res)); + + // 2. + System.out.println("2. klasa reszty: "); + res = polynomialsDivide(polyOne,polyTwo,n); + if(res != null){ + System.out.println(Arrays.toString(res)); + } + + // 3. + System.out.println("3. nwd: "); + res = nwd(polyOne,polyTwo,n); + System.out.println(Arrays.toString(res)); + + reader.close(); + } + + } catch(IOException e) { + e.printStackTrace(); + } + + //input + /* + do{ + System.out.println("Podaj n: "); + // wpisz liczbe + n = reader.nextInt(); + + }while(n > 1000 || n <= 0); + + + System.out.println("Pierwszy wielomian: "); + polyOne = fillPolynomial(); + + System.out.println("Drugi wielomian: "); + polyTwo = fillPolynomial(); + */ + + + reader.close(); + } + + + // uzupelnianie tablicy + public static int[] fillPolynomial() { + + // zmienna pomocnicza + int temp = 0; + + System.out.println("Podaj liczbe wyrazow w wielomianie: "); + temp = reader.nextInt(); + + int[] tab = new int[temp]; + + // uzupelnianie pierwszego wielomianu + System.out.println("Podaj kolejne wyrazy wielomianu po przycisku enter"); + + for(int i=0; i= ptd) { + + // modulo dla ujemnych + if(polyOne[pod]<0) { + polyOne[pod] = mod + polyOne[pod]; + } + + // szukany mnoznik + temp = multiplier(polyOne[pod], polyTwo[ptd], mod); + + // przesuniecie tablicy + tempTab = polynomialShift(tempTab,i); + + // mnozenie wielomianow + tempTab = polynomialMultiplication(tempTab, temp); + + tempTab = modTheTab(tempTab, mod); + + // odejmowanie wielomianow + polyOne = polynomialsSubstraction(polyOne,tempTab); + + // zmiejszamy stopien pierwszego wielomianu + pod--; + + // zwiekszamy liczbe przesuniec drugiej tablicy + i++; + + } + result = Arrays.copyOf(polyOne, i-1); + + return result; + } + + // 3. + public static int[] nwd(int polyOne[], int polyTwo[], int mod) { + + if(polyTwo.length == 0) { + return polyOne; + } + if(polyOne.length >= polyTwo.length) { + return nwd(polyTwo, polynomialsDivide(polyOne,polyTwo,mod),mod); + } + else { + return nwd(polyTwo, polynomialsDivide(polyTwo,polyOne,mod),mod); + } + } + +} \ No newline at end of file