ZAD4 #33
196
App.java
Normal file
196
App.java
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user