import java.util.ArrayList;
import java.util.stream.Collectors;

public class Seminarium2 {
    public static int gcd(int a, int b) {
        while (b > 0) {
            int c = a % b;
            a = b;
            b = c;
        }
        return a;
    }

    public static String factor(int n) {
        ArrayList<Integer> factors = new ArrayList<Integer>();
        int i = 2;
        while (n > 1) {
            while (n % i == 0) {
                factors.add(i);
                n /= i;
            }
            i++;
        }
        if (factors.isEmpty()) {
            return "1";
        } else {
            return factors.stream().map(String::valueOf).collect(Collectors.joining("⋅"));
        }
    }

    public static boolean isPrime(int n) {
        if (n <= 1) {
            return false;
        }
        for (int i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static String toSubscript(int n) {
        return Integer.toString(n)
            .replace("0", "\u2080")
            .replace("1", "\u2081")
            .replace("2", "\u2082")
            .replace("3", "\u2083")
            .replace("4", "\u2084")
            .replace("5", "\u2085")
            .replace("6", "\u2086")
            .replace("7", "\u2087")
            .replace("8", "\u2088")
            .replace("9", "\u2089");
    }

    public static void uppgift2a() {
        System.out.println("Uppgift 2a:");
        System.out.println("sgd(133, 161) = " + gcd(133, 161));
    }

    public static void uppgift3a() {
        System.out.println("Uppgift 3a:");
        for (int n = 1; n <= 10; n++) {
            int an = (1 << n) - 1;
            System.out.println("a" + toSubscript(n) + " = " + factor(an));
        }
    }

    public static void uppgift3d() {
        System.out.println("Uppgift 3d:");
        int n = 2;
        while (true) {
            int an = (1 << n) - 1;
            if (isPrime(n) && !isPrime(an)) {
                System.out.println(n + " är ett primtal men a" + toSubscript(n) + " = " + factor(an) + " är inte ett primtal");
                break;
            }
            n++;
        }
    }

    public static void uppgift4a() {
        System.out.println("Uppgift 4a:");
        int[] F = new int[20];
        F[0] = 0;
        F[1] = 1;
        for (int i = 2; i < F.length; i++) {
            F[i] = F[i - 2] + F[i - 1];
        }
        for (int i = 1; i < F.length; i++) {
            for (int j = i + 1; j < F.length; j++) {
                System.out.println("sgd(F" + toSubscript(i) + ", F" + toSubscript(j) + ") = " + gcd(F[i], F[j]));
            }
        }
    }

    public static void main(String[] args) {
        uppgift2a();
        uppgift3a();
        uppgift3d();
        uppgift4a();
    }
}
