algorithm

[소수]

수학소년 2023. 7. 31. 16:20

에라토스테네스 체

var answer = [];
var N = 1000000;

var A = [];
for (var i=1; i<=N; i++) {
    A.push(i);
}
A[0] = 0;

for (var i=2; i<=Math.sqrt(N); i++) {
    if (A[i-1] != 0) {
        for (var j=i*2; j<=N; j+=i) {
            A[j-1] = 0;
        }
    }
}

for (var i=0; i<A.length; i++) {
    if (A[i] != 0) {
        answer.push(A[i]);
    }
}

GCD

function gcd(a,b) {
    var max = 0;
    var min = 0;
    if (a <= b) {
        max = b;
        min = a;
    } else {
        max = a;
        min = b;
    }

    /*var r = max % min;
    while (min % r != 0) {
        max = min;
        min = r;
        r = max % min;
    }
    return r;*/
    if (min == 0) return a;
    else return gcd(min, max % min);
}

최소공배수

function lcm(a,b) {
    return a*b/gcd(a,b);
}

소인수분해

var obj = {};
var result = N;
for (var i=2; i<=Math.sqrt(N); i++) {
    console.log(i,N)
    if (N % i == 0) {
        result -= result / i;
        while (N % i == 0) {
            N /= i;
            if (!obj[i]) obj[i] = 0;
            obj[i]++;
        }
        console.log(i,N)
    }
}

if (N > 1) result -= result / N;
if (!obj[N]) obj[N] = 0;
obj[N]++;
console.log(obj);

for문 돌고 난 뒤 N은 소수임.

(∵ 만약에 N이 합성수면 2~Math.sqrt(N) 사이의 정수를 인수로 가지고 있을꺼임.

근데 for문에서 다 제거했는데? ⇒⇐)