ZAD4 #33

Closed
s426182 wants to merge 18 commits from (deleted):ZAD4 into master
Showing only changes of commit 9d1452fa16 - Show all commits

196
App.java Normal file
View File

@ -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<a<=1000): ");
try {
// wpisz liczbe
number = reader.nextInt();
}catch(InputMismatchException exception) {
System.out.println("Integers only, please");
reader.nextLine();
}
}while(number > 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<Stack<Integer>> output = new Stack<Stack<Integer>>();
// 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<Integer> reversible(int number) {
Stack<Integer> reversibleNumbers = new Stack<Integer>();
int temp;
for (int i = 1; i<number ; i++) {
temp = nwd(number, i);
// sprawdzam czy jest wzglednie pierwsza
if(temp == 1) {
reversibleNumbers.push(i);
}
}
return reversibleNumbers;
}
// 2. dzielniki zera
public static Stack<Integer> zeroDivisors(int number) {
Stack<Integer> zeroDivisors = new Stack<Integer>();
// 0 (element neutralny dodawania) zawsze jest swoim dzielnikiem
zeroDivisors.push(0);
int temp;
for(int i = 1; i<number; i++) {
temp = i;
for(int j=1; j<number; j++) {
// jesli a*b mod n = 0 oraz liczby nie ma jeszcze w stosie
if((temp*j)%number == 0 && !zeroDivisors.contains(temp)) {
zeroDivisors.push(temp);
}
}
}
return zeroDivisors;
}
// 3. elementy nilpotentne
public static Stack<Integer> nilpotent(int number) {
Stack<Integer> nilpotentNumbers = new Stack<Integer>();
// 0 (element neutralny dodawania) zawsze spelnia warunek nilpotentnosci
nilpotentNumbers.push(0);
int temp, tempPow;
for(int i = 2; i<number; i++) {
temp = i;
// sprawdzam czy jest wzglednie pierwsza jesli tak to nie jest nilpotentna
if(nwd(temp,number) == 1) {
continue;
}
// tymczasowe a^n (tempPow^powCount)
tempPow = 1;
for(int j=1; j<number; j++) {
tempPow = (int) Math.pow(temp, j);
// warunek sprawdzajacy kandydata na nilpotetna
if(tempPow % number == 0) {
nilpotentNumbers.push(temp);
break;
}
}
}
return nilpotentNumbers;
}
// 4. elementy idempotentne
public static Stack<Integer> idempotent(int number) {
Stack<Integer> idempotentNumbers = new Stack<Integer>();
// 0 (element neutralny dodawania) zawsze spelnia warunek idempotentnosci
idempotentNumbers.push(0);
int temp;
for(int i = 1; i<number; i++) {
temp = i;
// jesli a^2 mod n == a
if(Math.pow(temp, 2) % number == temp) {
idempotentNumbers.push(temp);
}
}
return idempotentNumbers;
}
}