java求循环节长度

版权声明:博客内容为本人自己所写,请勿转载。 https://blog.csdn.net/weixin_42805929/article/details/82668437

循环节

/**
 * 循环节: a = (x ^ k) % c 
 * 当 x = 2,c = 15时
 * k = 0, a = 1;
 * k = 1, a = 2;
 * k = 2, a = 4;
 * k = 3, a = 8;
 * k = 4, a = 1;
 * 所以循环节的长度为 4
 * 
 * 要求:c > 1
 */
import java.util.*;

public class Main {
    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        int c = sc.nextInt();
        int ci = circle(x, c);
        System.out.println(ci);
    }

    public static int circle(int x, int c) {
        int count = 0;
        ArrayList<Integer> list = new ArrayList<>();
        int s = x;
        int a = 0;
        boolean flag = true;
        if (c > 1) {
            if (x == 1) {
                count = 1;
            } else {
                for (int i = x; i <= Math.sqrt(c); i++) {
                    if (c % x == 0) {
                        flag = false;
                    }
                }
                if (flag == true) {
                    for (int i = 0; i <= count; i++) {
                        if (count == 0) {
                            s = 1;
                            a = s % c;
                            if (!list.contains(a)) {
                                list.add(a);
                                count++;
                            }
                        } else {
                            s = s * x;
                            a = s % c;
                            if (!list.contains(a) && s < c) {
                                list.add(a);
                                count++;
                            }
                        }
                    }
                }
            }
        }
        return count;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42805929/article/details/82668437