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ı n
asal değilse, iki faktöre katılabilir a
ve b
:
n = a * b
Şimdi a
ve b
her ikisinin de kare kökünden daha büyük olamaz n
, çünkü o zaman ürün a * b
daha büyük olacaktır sqrt(n) * sqrt(n) = n
. Bu nedenle, herhangi bir çarpanlarına ayırma n
işleminde, faktörlerden en az birinin karekökünden daha küçük olması gerekir n
ve karekökünden daha küçük veya ona eşit bir faktör bulamazsak, n
asal olmalıdır.
sqrt(n)
biz kayan noktaları kullandığınızı verilen muhafazasına bu özellik için kesin yeterli olmak zorunda.
i * i <= n
yerine i <= sqrt(n)
kayan noktalı sayıların inceliklerini kaçınmak istiyorsanız.
Diyelim m = sqrt(n)
sonra m × m = n
. Şimdi eğer n
o zaman bir asal değildir n
olarak yazılabilir n = a × b
, böylece m × m = a × b
. Bildirim m
oysa gerçek sayıdır n
, a
ve b
doğal sayılardır.
Şimdi 3 vaka olabilir:
Her üç durumda da min(a, b) ≤ m
,. Bu nedenle, eğer arama m
yaparsak, asal olmadığını n
göstermek için yeterli olan en az bir faktör bulmak zorundayız n
.
n is not a prime
ve 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 n
asal sayı değil (1'den büyük). Yani sayılar var a
ve b
öyle ki
n = ab (1 < a <= b < n)
İlişkiyi çarparak a<=b
tarafından a
ve b
elde ederiz:
a^2 <= ab
ab <= b^2
Bu nedenle: (not edin n=ab
)
a^2 <= n <= b^2
Bu nedenle: (Unutmayın a
ve b
olumludur)
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ı N
asal değil,
Daha sonra, N, iki faktörleri içine factorized edilebilir a
ve b
, 2 <= a, b < N
bu şekilde N = a*b
. Açıkçası, her ikisi de sqrt(N)
aynı anda olduğundan daha büyük olamaz .
a
Daha 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 N
herhangi böleni yoktur [2, a]
olaraka <= sqrt(N)
.
Bu nedenle, a = 1
ve b = n
dolayısıyla Tanım olarak, N
asal .
...
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, N
bunun 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 N
asal 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 1
ve aşağıda ya da yukarı doğru herhangi bir sayı sqrroot(n)
eşit olarak bölünürse n
, n
asal 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;
}
guard
bu 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.
++i
her 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 p
kendi 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 a
artar, daha sonra b
korumak 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 p
mutlaka bir tamsayı anlamına gelmez, çünkü öyleyse n
asal olmaz. Yani, p
gerç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 p
bir 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 root
ve 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 === 0
ama n % p1 !== 0
aynı 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*b
vea <= b
sonraa*a <= a*b = n
.