Asal olup olmadığını belirlemek için neden asal sayının karekökünü kontrol ediyoruz?


392

Bir sayının asal olup olmadığını test etmek için, niçin sadece o sayının kareköküne kadar bölünebilir olup olmadığını test etmek zorundayız?


33
çünkü eğer n = a*bve a <= bsonra a*a <= a*b = n.
Ness

7
Açıklığa kavuşturmak için, bu sadece şu ana kadar test etmemiz gerektiği anlamına gelir floor(sqrt(n)).
Acumenus

Yanıtlar:


659

Bir sayı nasal değilse, iki faktöre katılabilir ave b:

n = a * b

Şimdi ave bher ikisinin de kare kökünden daha büyük olamaz n, çünkü o zaman ürün a * bdaha büyük olacaktır sqrt(n) * sqrt(n) = n. Bu nedenle, herhangi bir çarpanlarına ayırma nişleminde, faktörlerden en az birinin karekökünden daha küçük olması gerekir nve karekökünden daha küçük veya ona eşit bir faktör bulamazsak, nasal olmalıdır.


Nasıl yok sqrt(n)biz kayan noktaları kullandığınızı verilen muhafazasına bu özellik için kesin yeterli olmak zorunda.
Benoît

Benoît @ Hep denetimini kullanabilirsiniz i * i <= nyerine i <= sqrt(n)kayan noktalı sayıların inceliklerini kaçınmak istiyorsanız.
Sven Marnach

348

Diyelim m = sqrt(n)sonra m × m = n. Şimdi eğer no zaman bir asal değildir nolarak yazılabilir n = a × b, böylece m × m = a × b. Bildirim moysa gerçek sayıdır n, ave bdoğal sayılardır.

Şimdi 3 vaka olabilir:

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

Her üç durumda da min(a, b) ≤ m,. Bu nedenle, eğer arama myaparsak, asal olmadığını ngöstermek için yeterli olan en az bir faktör bulmak zorundayız n.


4
n = 12 m = sqrt (12) = 3.46, a = 2, b = 6. n = m m yani 12 = 3.46 * 3.46 ve n = a b yani 12 = 2 * 6. Şimdi durum 3. a <m <b yani 2 <3.46 <6. Bu nedenle, asal değerin kontrol edilmesi için, bu sayının asal olmadığını bulmak için 2 olan 3.46'dan küçük sayıları kontrol etmemiz gerekir. Bu nedenle, bölünebilirliği n'nin kare köküne eşit veya daha küçük (n = 4, m = a = b = 2) sayılarla kontrol edin.
anukalp

2
Önce varsayımı vurgulamamız gerektiğini düşünüyorum. Varsayalım n is not a primeve kanıtlayın, aksi takdirde bu bir asaldır.
Huei Tan

Aslında, bunun daha iyi bir cevap olduğuna ikna olmadım. Doğru bir cevap, ama soruya gerçekten cevap vermiyor. Sadece primerler ve sqrt etrafındaki diğer dinamikleri açıklar. @ Sven'in cevapları hem kısa ve öz hem de süreçte daha fazla soru yaratmıyor.
Jon M

1
Son iyi sürüme geri döndüm. Birisi akış için gerekli olan bir kelimeyi gereksiz yere kaldırdığında ('dolayısıyla') kaçırdınız.
Ness Ness

55

Çünkü eğer bir faktör n'nin kare kökünden büyükse, onunla n'ye eşit olan diğer faktör n'nin kare kökünden zorunlu olarak daha azdır.


37

Daha sezgisel bir açıklama: -

100'ün kare kökü 10'dur. Diyelim ki a ve b'nin çeşitli çiftleri için axb = 100.

A == b ise, o zaman eşittir ve tam olarak 100'ün kareköküdür. Hangisi 10.

Bunlardan biri 10'dan küçükse, diğeri daha büyük olmalıdır. Örneğin, 5 x 20 == 100. Biri 10'dan büyük, diğeri 10'dan küçük.

Axb hakkında düşünmek, eğer biri düşerse, diğeri telafi etmek için daha büyük olmalı, bu yüzden ürün 100'de kalıyor. Kare kök etrafında dönüyorlar.

101'in kare kökü yaklaşık 10.049875621'dir. Bu nedenle, 101 sayısını önceliklilik için test ediyorsanız, 10 dahil olmak üzere sadece 10'a kadar olan tam sayıları denemeniz gerekir. önemli.

Çünkü sayılardan biri 10'dan büyük olan bir çift faktör varsa, çiftin diğeri 10'dan az olmalıdır. Daha küçük olanı yoksa, 101 ile eşleşen daha büyük bir faktör yoktur.

121 test ediyorsanız, karekök 11'dir. Düzgün girip girmediğini görmek için 1 ila 11 (dahil) asal sayılarını test etmeniz gerekir. 11, 11 kez giriyor, bu yüzden 121 asal değil. Eğer 10'da durmuş ve 11'i test etmemiş olsaydınız, 11'i kaçırırdınız.

Sadece tek sayıları test ettiğiniz varsayılarak, 2'den büyük, ancak karekökten küçük veya ona eşit olan her asal tamsayıyı test etmeniz gerekir.

'


3
"Axb hakkında düşünmek, eğer biri düşerse, diğeri telafi etmek için daha büyük olmalı, bu yüzden ürün 100'de kalıyor. Kare kök etrafında dönüyorlar." Aha anım! Teşekkür ederim!
Brian Wigginton

Bu en iyi cevap.
JeanieJ

19

Diyelim ki nasal sayı değil (1'den büyük). Yani sayılar var ave böyle ki

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

İlişkiyi çarparak a<=btarafından ave belde ederiz:

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

Bu nedenle: (not edin n=ab)

a^2 <= n <= b^2

Bu nedenle: (Unutmayın ave bolumludur)

a <= sqrt(n) <= b

Eğer bir sayı (1'den büyük) asal değilse ve sayının kareköküne kadar bölünebilirliği test edersek, faktörlerden birini bulacağız.


8

Diyelim ki verilen tam sayı Nasal değil,

Daha sonra, N, iki faktörleri içine factorized edilebilir ave b, 2 <= a, b < Nbu şekilde N = a*b. Açıkçası, her ikisi de sqrt(N)aynı anda olduğundan daha büyük olamaz .

aDaha küçük olan genelliği kaybetmeden varsayalım .

Şimdi, Nürün yelpazesine ait herhangi bir bölme bulamadıysanız [2, sqrt(N)], bu ne anlama geliyor?

Bu araçlar Nherhangi böleni yoktur [2, a]olaraka <= sqrt(N) .

Bu nedenle, a = 1ve b = ndolayısıyla Tanım olarak, Nasal .

...

Memnun kalmazsanız daha fazla okuma:

Birçok farklı kombinasyon (a, b)mümkün olabilir. Diyelim ki bunlar:

(a 1 b , 1 (a) 2 b 2 (a) 3 b , 3 ), ....., (a k b k ). Genelliği kaybetmeden, bir farz i b < i , 1<= i <=k.

Şimdi, Nbunun asal olmadığını gösterebilmek için, i'nin hiçbirinin daha fazla faktörleştirilemeyeceğini göstermek yeterlidir . Ve ayrıca bir i <= olduğunu biliyoruz sqrt(N)ve bu yüzden sqrt(N)hangisinin tüm i'yi kapsayacağını kontrol etmeniz gerekiyor . Ve böylece Nasal olup olmadığına karar verebileceksiniz .

...


7

Aslında sadece Faktorizasyon ve Karekök temel kullanımları.

Soyut gibi görünebilir, ancak gerçekte asal olmayan bir sayının olası maksimum faktörünün kare kökü olması gerektiğinden kaynaklanmaktadır:

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

Buna göre, yukarıda 1ve aşağıda ya da yukarı doğru herhangi bir sayı sqrroot(n)eşit olarak bölünürse n, nasal sayı olamaz.

Sözde kod örneği:

i = 2;

is_prime = true;

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

Mükemmel gözlem. Bu gözlemi kullanarak hesap makinesindeki gücü boşa harcamak yerine hesaplamadan erken çıkış yapmak için guardbu kullanışlı stackoverflow.com/a/25555762/4475605 ile birlikte bir ifade oluşturmak için kullanın. Gönderdiğiniz için teşekkürler.
Adrian

@Adrian İtiraf etmeliyim ki bu cevaba geri döndükten sonra, gönderirken bir hata buldum. Bir 0 üzerinde bölünme yapamazsınız ve teoride ++iher zaman yanlış döndürecek olan 1 sayısı olabilirseniz (çünkü 1 her şeye bölünür). Yukarıdaki cevabı düzelttim.
Super Cat

Evet ... Kodumda ... karekök gözleminizin, hesaplama yapmaya başlamadan önce asal olmayan bir değer atmanın harika bir yolu olduğunu söyledim. Çok zaman kaybına uğrayan çok sayıda kişiyle öldürülüyordum. Ayrıca bu algoritmanın büyük sayılardaki işlem sürelerini de önemli ölçüde azaltabileceğini öğrendim. en.wikipedia.org/wiki/Miller –Rabin_primality_test
Adrian

6

N sayısının Prime olup olmadığını kontrol etmek için. Yalnızca N'nin <= SQROOT (N) sayılarına bölünüp bölünmediğini kontrol etmemiz gerekir. Çünkü N'yi herhangi bir 2 faktöre çarparsak, X ve Y diyelim, yani. N = X Y. X ve Y'nin her biri SQROOT (N) 'den daha az olamaz, çünkü X Y <N X ve Y'nin her biri SQROOT (N)' den daha büyük olamaz çünkü X * Y> N

Bu nedenle bir faktör SQROOT (N) değerine eşit veya daha küçük olmalıdır (diğer faktör SQROOT (N) değerine eşit veya daha büyük olmalıdır). Bu yüzden N'nin Prime olup olmadığını kontrol etmek için sadece bu sayıları kontrol etmemiz gerekir <= SQROOT (N).


3

Diyelim ki asal olmayan bir sayı "a" var, [asal / bileşik sayı anlamına gelmez - 1 veya kendisinden başka sayılara eşit olarak bölünebilen bir sayı. Örneğin, 6 eşit olarak 2 veya 3'e ve ayrıca 1 veya 6'ya bölünebilir].

6 = 1 × 6 veya 6 = 2 × 3

Şimdi "a" asal değilse, diğer iki sayıya bölünebilir ve diyelim ki bu sayılar "b" ve "c" diyelim. Anlamına gelir

a = b * C.

Şimdi "b" veya "c" ise, bunlardan herhangi biri "a" nın kare kökünden daha büyüktür "b" ve "c" çarpımı "a" dan daha büyük olacaktır.

Yani, "a" veya "c" her zaman <a "b" c "denklemini kanıtlamak için" a "nın kare köküdür.

Yukarıdaki sebepten dolayı, bir sayının asal olup olmadığını test ettiğimizde, sadece o sayının kareköküne kadar kontrol ederiz.


1
b & c <= Math.sqrt (n) ?; Daha doğrusu b || c (b veya c) çünkü n = 6, b = 3, c = 2 ise Math.sqrt (n)> c.
daGo

Düzeltme için teşekkürler dostum. düzeltmeyi yapıyor. :)
Abu Naser Md Shoaib

2

Herhangi bir sayı verildiğinde n, faktörlerini bulmanın bir yolu kare kökünü elde etmektir p:

sqrt(n) = p

Tabii ki, eğer pkendi kendine çoğalırsak, o zaman geri döneriz n:

p*p = n

Şu şekilde yeniden yazılabilir:

a*b = n

Nerede p = a = b. Eğer aartar, daha sonra bkorumak için azalır a*b = n. Bu nedenle, püst sınırdır.

Güncelleme: Bu cevabı bugün tekrar okuyorum ve bu benim için daha açık hale geldi. Değer pmutlaka bir tamsayı anlamına gelmez, çünkü öyleyse nasal olmaz. Yani, pgerçek bir sayı olabilir (yani kesirlerle). Ve nşimdi tüm yelpazeden geçmek yerine, sadece tüm yelpazeden geçmemiz gerekiyor p. Diğeri pbir ayna kopyasıdır, bu yüzden aslında aralığı yarıya indiririz. Ve sonra, görüyorum ki, aslında menzili yarıya kadar yeniden yapmaya square rootve yapmaya devam edebiliriz p.


1

N asal olmamalı. Bu nedenle, 1'den büyük en az iki tamsayı faktörüne sahiptir. F n'nin bu faktörlerinin en küçüğü olsun. Diyelim ki f> sqrt n. Daha sonra n / f, bir tam sayı LTE sqrt n'dir, bu nedenle f'den daha küçüktür. Bu nedenle, f n'nin en küçük faktörü olamaz. Reductio ad absurdum; n'nin en küçük faktörü LTE sqrt n olmalıdır.


1

Herhangi bir kompozit sayı, primerlerin bir ürünüdür.

Diyelim ki n = p1 * p2, neredep2 > p1 ve onlar asal.

Eğer n % p1 === 0öyleyse n bileşik sayıdır.

Eğer n % p2 === 0öyleyse tahmin et nen % p1 === 0 de !

Öyleyse böyle bir yol yok n % p2 === 0ama n % p1 !== 0aynı zamanda. Başka bir deyişle, n bir bileşik sayısı p2, p3 ... pi'ye (daha büyük faktörü) eşit olarak bölünebiliyorsa, en düşük faktörü p1'e de bölünmelidir . En düşük faktörün p1 <= Math.square(n)her zaman doğru olduğu ortaya çıkıyor .


Eğer neden doğru olduğunu merak ediyorsanız @LoMaPh cevabını gerçeği büyük ölçüde açıkladı. Cevabımı ekledim çünkü sağlanan diğer cevapları görselleştirmek ve anlamak için gerçekten zor zamanlar geçirdim. Sadece tıklanmadı.
daGo

0

Bir sayının önceliğini test etmek, n , ilk etapta aşağıdaki gibi bir döngü beklenir:

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

Yukarıdaki döngünün yaptığı şudur: belirli bir 1 <i <n için , n / i'nin bir tam sayı olup olmadığını kontrol eder (kalan 0 değerini bırakır). N / i'nin bir tam sayı olduğu bir i varsa, n'nin bir asal sayı olmadığından emin olabiliriz, bu noktada döngü sona erer. Hiçbir i için n / i bir tamsayı ise, n asaldır.

Her algoritmada olduğu gibi: Daha iyisini yapabilir miyiz?

Yukarıdaki döngüde neler olduğunu görelim.

İ sekansı gider: i = 2, 3, 4, ..., n-1

Ve tamsayı kontrolleri sırası şöyledir: j = n / i, n / 2, n / 3, n / 4, ..., n / (n-1)

Bazı i = a için n / a bir tamsayı ise, n / a = k (tamsayı)

veya n = ak, açıkça n> k> 1 (k = 1 ise, o zaman a = n, ama asla n'ye ulaşmaz; ve k = n ise, a = 1, ancak form 2'ye başlar)

Ayrıca, n / k = a ve yukarıda belirtildiği gibi a, i'nin bir değeri olduğundan n> a> 1'dir.

Yani, a ve k'nin her ikisi de 1 ve n (münhasır) arasındaki tamsayılardır. Bu aralıktaki her tam sayıya ulaştığım için, bazı yinelemelerde i = a ve diğer bazı yinelemelerde i = k. N'nin öncelik testi min (a, k) için başarısız olursa, max (a, k) için de başarısız olur. Bu nedenle, min (a, k) = max (a, k) (iki kontrolün bire düştüğü yerlerde), yani a = k olmadığı sürece, bu iki durumdan sadece birini kontrol etmemiz gerekir, bu noktada a * a = n, a = sqrt (n) anlamına gelir.

Başka bir deyişle, n'nin öncelik testi bazı i> = sqrt (n) (yani, max (a, k)) için başarısız olsaydı, o zaman bazı i <= n (yani, min (a k)). Bu nedenle, i = 2 ila sqrt (n) için testi çalıştırmamız yeterli olacaktır.


Yorumlarda ve 6 yaşındaki cevaplarda çok daha kısa ve IMHO'nun anlaşılması çok daha kolay ve konu hakkında daha fazla açıklama var ...
Thierry Lathuille
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.