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?
floor(sqrt(n)).
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?
floor(sqrt(n)).
Yanıtlar:
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.
sqrt(n)biz kayan noktaları kullandığınızı verilen muhafazasına bu özellik için kesin yeterli olmak zorunda.
i * i <= nyerine i <= sqrt(n)kayan noktalı sayıların inceliklerini kaçınmak istiyorsanız.
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:
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.
n is not a primeve kanıtlayın, aksi takdirde bu bir asaldır.
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.
'
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.
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 .
...
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;
}
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.
++iher zaman yanlış döndürecek olan 1 sayısı olabilirseniz (çünkü 1 her şeye bölünür). Yukarıdaki cevabı düzelttim.
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).
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.
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.
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.
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 .
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.
n = a*bvea <= bsonraa*a <= a*b = n.