소수의 제곱근을 검사하여 소수인지 확인하는 이유는 무엇입니까?


답변:


659

숫자가있는 경우 n주요 아니라,이 두 가지 요소로 고려 될 수 ab:

n = a * b

이제 ab의 제곱근보다 두 클 수 없습니다 n다음 제품이 있기 때문에, a * b보다 큰 것이다 sqrt(n) * sqrt(n) = n. 따라서의 인수 분해 n에서 적어도 하나의 인수는 의 제곱근보다 작아야하며, 제곱근 n이하인 요소를 찾을 수없는 경우 n소수 여야합니다.


어떻게 sqrt(n)우리가 떠있는 포인트를 사용하고 있는지 주어진 보류이 속성에 대한 정확한 충분합니다.
Benoît

@ Benoît 부동 소수점 숫자의 복잡성을 피하려면 항상 i * i <= n대신 검사 를 사용할 수 있습니다 i <= sqrt(n).
Sven Marnach

348

m = sqrt(n)그때 말해 보자 m × m = n. 이제 경우는 n다음 주요 아닙니다 n같이 쓸 수있다 n = a × b그래서 m × m = a × b. 공지 사항 m반면 실수입니다 n, a그리고 b자연의 번호입니다.

이제 3 가지 경우가 있습니다 :

  1. a> m ⇒ b <m
  2. a = m ⇒ b = m
  3. a <m ⇒ b> m

세 경우 모두 min(a, b) ≤ m. 따라서까지 검색하면 m적어도 하나의 요소를 찾아야합니다 n. 이는 n소수가 아닌 것으로 표시하기에 충분합니다 .


4
n = 12 m = sqrt (12) = 3.46, a = 2, b = 6. n = m m, 즉 12 = 3.46 * 3.46 및 n = a b 즉 12 = 2 * 6. 이제 조건 3. a <m <b 즉 2 <3.46 <6. 따라서 소수를 확인하려면 숫자가 소수가 아닌 것을 알기 위해 2.46보다 작은 숫자 만 확인하면됩니다. 따라서 n의 제곱근 (n = 4, m = a = b = 2)보다 작거나 같은 숫자로 나누기 성을 확인하십시오.
anukalp

2
먼저 가정을 강조해야한다고 생각합니다. 가정 n is not a prime하고 증명하십시오. 그렇지 않으면 소수입니다.
Huei Tan

사실, 나는 그것이 더 나은 대답이라고 확신하지 않습니다. 정답이지만 실제로 질문에 대답하지는 않습니다. 프라임 및 sqrt와 관련된 다른 역학에 대해서만 설명합니다. @Sven의 답변은 간결하며 프로세스에서 더 많은 질문을 만들지 않습니다.
Jon M

1
마지막으로 좋은 버전으로 롤백했습니다. 누군가가 흐름에 필요한 단어 ( '따라서')를 불필요하게 제거했을 때 그것을 놓쳤다.
Will Ness

55

요인이 n의 제곱근보다 크면 n과 같은 다른 요인이 반드시 n의 제곱근보다 작아야합니다.


37

더 직관적 인 설명은 다음과 같습니다.

100의 제곱근은 10입니다. a와 b의 다양한 쌍에 대해 axb = 100이라고합시다.

a == b이면, 그것들은 동일하며 정확히 100의 제곱근입니다. 10입니다.

그중 하나가 10보다 작 으면 다른 하나는 더 커야합니다. 예를 들어 5 x 20 == 100입니다. 하나는 10보다 크고 다른 하나는 10보다 작습니다.

axb에 대해 생각할 때, 그중 하나가 쓰러지면 다른 하나는 보상하기 위해 커져야하므로 제품은 100을 유지합니다. 그들은 제곱근을 중심으로 피벗합니다.

101의 제곱근은 약 10.049875621입니다. 따라서 숫자 101을 우선 순위로 테스트하는 경우 10을 포함하여 10에서 10까지의 정수만 시도하면됩니다. 그러나 8, 9 및 10은 소수가 아니므로 7까지만 테스트하면됩니다. 초기.

하나의 숫자가 10보다 큰 요인 쌍이있는 경우 다른 쌍은 10보다 작아야합니다. 더 작은 요소가 존재하지 않으면 일치하는 더 큰 계수 101이 없습니다.

121을 테스트하는 경우 제곱근은 11입니다. 소수가 1에서 11까지 (포함) 포함되어 있는지 확인해야합니다. 11은 11 번 들어가므로 121은 소수가 아닙니다. 10시에 멈췄지만 11 번은 테스트하지 않았다면 11 번을 놓쳤을 것입니다.

홀수 만 테스트한다고 가정 할 때 2보다 크지 만 제곱근 이하인 모든 소수를 테스트해야합니다.

`


3
"도끼에 대해 생각할 때, 그중 하나가 고장 나면 다른 하나는 보상하기 위해 더 커져야한다. 따라서 제품은 100을 유지한다. 그들은 제곱근을 중심으로 회전한다." 내 아하 순간! 감사합니다!
브라이언 Wigginton

이것이 가장 좋은 대답입니다.
JeanieJ

19

n소수 (1보다 큰 숫자)가 아니라고 가정 합니다. 그래서이 번호는 a하고 b그러한

n = ab      (1 < a <= b < n)

관계를 곱 a<=b에 의해 a그리고 b우리가 얻을 :

a^2 <= ab
 ab <= b^2

따라서 : (참고 n=ab)

a^2 <= n <= b^2

따라서 (주 ab긍정적)

a <= sqrt(n) <= b

따라서 숫자 (1보다 큰)가 소수가 아니며 수의 제곱근까지의 나누기 성을 테스트하면 요인 중 하나를 찾을 수 있습니다.


8

주어진 정수 N가 소수가 아니라고 가정 해 봅시다 .

이어서 N은 두 가지 요인으로 인수 분해 가능 a하고 b, 2 <= a, b < N되도록 N = a*b. 분명히, 둘 다 sqrt(N)동시에 보다 클 수는 없습니다 .

일반성을 잃지 않고 a더 작은 것으로 가정합시다 .

이제 N범위 에 속하는 제수를 찾을 수 없다면 [2, sqrt(N)]그 의미는 무엇입니까?

이 수단 N에있는 약수가없는 [2, a]등을 a <= sqrt(N).

따라서, a = 1b = n따라서 정의에 의해, N소수 .

...

당신이 만족하지 않으면 더 읽을 거리 :

많은 다른 조합이 (a, b)가능할 수 있습니다. 그들이 있다고 가정 해 봅시다.

(a 1 , b 1 ), (a 2 , b 2 ), (a 3 , b 3 ), ....., (a k , b k ). 일반성을 잃지 않으면 서 i <b i , 이라고 가정하십시오 1<= i <=k.

이제 N소수가 아니라는 것을 보여줄 수 있다면 i 를 더 이상 분해 할 수 없다는 것을 보여주는 것으로 충분합니다 . 그리고 우리는 또한 i <= sqrt(N)이므로 sqrt(N)모든 i를 덮을 때까지 확인해야합니다 . 따라서 당신 N은 소수 인지 결론을 내릴 수 있습니다 .

...


7

그것은 실제로 인수 분해와 제곱근의 기본 용도입니다.

추상적 인 것처럼 보이지만 실제로는 비 프라임 숫자의 최대 계승이 다음과 같은 이유로 제곱근이어야한다는 사실에 있습니다.

sqrroot(n) * sqrroot(n) = n.

위의 모든 정수 경우, 점을 감안 1이하 또는 최대 sqrroot(n)균등에 분할은 n다음 n소수가 될 수 없습니다.

의사 코드 예 :

i = 2;

is_prime = true;

while loop (i <= sqrroot(n))
{
  if (n % i == 0)
  {
    is_prime = false;
    exit while;
  }
  ++i;
}

훌륭한 관찰. 이 관측치를 사용 guard하여이 편리한 stackoverflow.com/a/25555762/4475605 와 함께 Swift에서 명령문 을 작성하면 계산 능력을 낭비하지 않고 계산을 조기에 종료 할 수 있습니다. 게시 해 주셔서 감사합니다.
Adrian

@Adrian이 답변으로 돌아온 후 게시 할 때 오류가 발견되었다고 고백해야합니다. 0에서 나누기를 수행 할 수 없으며 이론적으로 ++i숫자 1이 될 수 있으면 항상 false를 반환합니다 (1은 모든 것을 나누기 때문에). 위의 답변을 수정했습니다.
슈퍼 고양이

네 ... 내 코드에서 해결했습니다 ... 제곱근 관측은 계산을 시작하기 전에 초기가 아닌 값을 버리는 좋은 방법입니다. 나는 큰 시간 낭비로 밝혀진 큰 숫자로 살해당했습니다. 또한이 알고리즘이 많은 수의 처리 시간을 크게 줄일 수 있다는 것도 알게되었습니다. en.wikipedia.org/wiki/Miller –Rabin_primality_test
Adrian

6

따라서 숫자 N이 소수인지 여부를 확인하십시오. N이 숫자 <= SQROOT (N)으로 나눌 수 있는지 확인하기 만하면됩니다. 왜냐하면 우리가 N을 X와 Y라고하는 두 가지 요소로 고려한다면, 즉. N = X Y. X와 Y는 각각 SQROOT (N)보다 작을 수 없으며, X Y <N이므로 X와 Y는 각각 SQROOT (N)보다 클 수 없습니다. X * Y> N

따라서 한 요인은 SQROOT (N)보다 작거나 같아야합니다 (다른 요인은 SQROOT (N) 이상). 따라서 N이 소수인지 확인하려면 숫자 <= SQROOT (N) 만 확인하면됩니다.


3

소수가 아닌 숫자 "a"가 있다고 가정합시다. [소수 / 복합 수는-1 이외의 숫자로 균등하게 나눌 수있는 숫자를 의미합니다. 예를 들어, 6은 2 또는 3, 1 또는 6으로 균등하게 나눌 수 있습니다].

6 = 1 × 6 또는 6 = 2 × 3

이제 "a"가 소수가 아닌 경우 다른 두 숫자로 나눌 수 있으며이 숫자가 "b"와 "c"라고 가정 해 봅시다. 어떤 의미

a = b * c.

이제 "b"또는 "c"인 경우 "a"보다 "b"& "c"의 곱셈보다 "a"의 제곱근보다 큽니다.

따라서 "b"또는 "c"는 방정식 "a = b * c"를 증명하기 위해 항상 "="의 제곱근입니다.

위의 이유로 인해 숫자가 소수인지 테스트 할 때 해당 숫자의 제곱근까지만 확인합니다.


1
b & c <= Math.sqrt (n) ?; 오히려 b || c (b 또는 c) n = 6, b = 3, c = 2이면 Math.sqrt (n)> c이므로
daGo

수정 해 주셔서 감사합니다. 정정하고 있습니다. :)
Abu Naser Md Shoaib

2

숫자가 주어지면 n요인을 찾는 한 가지 방법은 제곱근을 얻는 것입니다 p.

sqrt(n) = p

물론 우리 p가 스스로 곱 하면 다시 돌아옵니다 n.

p*p = n

다음과 같이 다시 작성할 수 있습니다.

a*b = n

어디 p = a = b. 경우 a가 증가하고 b유지하기 위해 감소a*b = n . 따라서 p상한입니다.

업데이트 : 오늘이 답변을 다시 읽고 더 명확 해졌습니다. 값 p이 정수를 의미 할 필요는 없습니다. 정수이면 n소수가 아니기 때문입니다. 따라서 p실수 일 수 있습니다 (예 : 분수). 그리고 전체 범위를 거치지 않고 n이제 전체 범위 만 통과하면 p됩니다. 다른 하나 p는 미러 사본이므로 사실상 범위를 절반으로 줄입니다. 그리고 지금, 우리는 실제로 계속해서 다시 할 수 있고 범위의 절반 square root까지 계속 할 수 있음을보고 있습니다 p.


1

n을 프라임이 아닌 것으로 보자. 따라서 1보다 큰 정수 인자가 2 개 이상 있습니다. f를 n의 이러한 인자 중 가장 작은 것으로합시다. f> sqrt n이라고 가정하십시오. 그러면 n / f는 정수 LTE sqrt n이므로 f보다 작습니다. 따라서 f는 n의 가장 작은 요소가 될 수 없습니다. 레덕 디오 아드 두르 덤; n의 가장 작은 요소는 LTE sqrt n이어야합니다.


1

모든 복합 번호는 소수의 곱입니다.

n = p1 * p2어디에 p2 > p1, 그리고 소수 라고 말합시다 .

만약 n % p1 === 0다음 N 복합 수이다.

그렇다면 n % p2 === 0무엇을 추측하십시오 n % p1 === 0!

그래서 방법이 없습니다 그 경우 n % p2 === 0하지만 n % p1 !== 0같은 시간에. 다시 말해서, 합성 수 np2, p3 ... pi (가장 큰 요소) 로 균등하게 나눌 수 있다면 가장 낮은 요소 p1 으로 나눠 져야합니다 . 가장 낮은 요소 p1 <= Math.square(n)는 항상 사실입니다.


사실 인지 궁금하다면 @LoMaPh가 그 사실을 크게 설명했습니다. 제공된 다른 답변을 시각화하고 이해하기가 정말 어려워서 답변을 추가했습니다. 클릭하지 않았습니다.
daGo

0

숫자 n 의 우선 성을 테스트하려면 먼저 다음과 같은 루프가 필요합니다.

bool isPrime = true;
for(int i = 2; i < n; i++){
    if(n%i == 0){
        isPrime = false;
        break;
    }
}

위의 루프가하는 일은 이것입니다 : 주어진 1 <i <n , n / i가 정수인지 확인합니다 (나머지는 0을 남습니다). 만약 n / i가 정수인 i가 존재한다면, 우리는 n이 소수가 아니며, 그 시점에서 루프가 종료된다는 것을 확신 할 수 있습니다. i가없는 경우, n / i는 정수이고, n은 소수입니다.

모든 알고리즘과 마찬가지로 다음과 같이 묻습니다. 우리가 더 잘 할 수 있습니까?

위 루프에서 무슨 일이 일어나고 있는지 보자.

i의 순서는 다음과 같습니다. i = 2, 3, 4, ..., n-1

그리고 정수 검사 순서는 다음과 같습니다. j = n / i, n / 2, n / 3, n / 4, ..., n / (n-1)

일부 i = a의 경우 n / a가 정수이면 n / a = k (정수)

또는 n = ak, 명확하게 n> k> 1 (k = 1이면 a = n이지만 i는 절대 n에 도달하지 않음; k = n이면 a = 1이지만 i는 형태 2를 시작 함)

또한, n / k = a이고, 위에서 언급 한 바와 같이, a는 i> n> 1의 값이다.

따라서 a와 k는 모두 1과 n 사이의 정수입니다 (제외). 따라서 i는 해당 범위의 모든 정수, 일부 반복 i = a 및 다른 반복 i = k에 도달합니다. n의 원시성 테스트가 min (a, k)에 대해 실패하면 max (a, k)에 대해서도 실패합니다. 따라서 min (a, k) = max (a, k) (두 검사가 하나로 감소하는 경우), 즉 a = k가 아니라면이 두 경우 중 하나만 확인하면됩니다. a = sqrt (n)을 의미합니다.

다시 말해, n의 원시성 테스트가 i> = sqrt (n) (즉, max (a, k))에 대해 실패하면, 일부 i <= n에 대해서도 실패합니다 (즉, min (a ,케이)). 따라서 i = 2에서 sqrt (n)에 대한 테스트를 실행하면 충분합니다.


의견과 6 년 된 답변에 훨씬 더 짧고 IMHO가 이해하기 쉽고 주제에 대한 더 많은 설명이 있습니다 ...
Thierry Lathuille
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.