Asal Faktör Algoritması: C, Python Örnek E-posta

⚡ Akıllı Özet

Asal Çarpan Algoritması, herhangi bir pozitif tamsayıyı, kareköküne kadar deneme bölmesi veya her en küçük asal çarpanı saklayan Eratosthenes Kalburu varyantı kullanarak asal sayıların çarpımına ayrıştırır.

  • 🧮 Tanım: Bir tamsayının asal çarpanları, çarpımları o sayıya eşit olan asal sayılardır; 10, 2 ve 5'e ayrılır.
  • 🔁 Yargılama Bölümü: 2'den sqrt(n)'ye kadar yineleme yapıp, mutlak değer sıfır olduğunda bölme işlemi O(sqrt(n)) sürede çalışır.
  • 🧰 Eleme Yöntemi: Her değer için en küçük asal çarpanı bir sınıra kadar saklamak, çarpanlara ayırma işlemini sorgu başına yaklaşık O(log n) seviyesine düşürür.
  • 🐍 Python Code: Yinelemeli ve özyinelemeli Python Bu uygulamalar, girilen sayının her asal çarpanını yazdırır.
  • ???? C Code: Yinelemeli ve özyinelemeli C programlarının eşleştirilmesi, stdio ve önceden hesaplanmış bir dizi kullanılarak aynı mantığı göstermektedir.
  • 🔐 Kullanım Alanları: Asal çarpanlara ayırma, bölünebilirlik kontrollerini, kesir sadeleştirmeyi, ortak paydaları ve sayı tabanlı şifreleme anahtarlarını güçlendirir.

Asal Faktör Algoritması

Asal çarpanlara ayırma nedir?

Bir sayının asal çarpanı, kendisi de bir çarpan olan bir sayıdır. asal sayıSadece 1'e ve kendisine bölünebilen sayı.

Örnek: 10'un asal çarpanları 2 ve 5'tir, çünkü 2 × 5 = 10.

Yinelemeyi Kullanarak Asal Faktörleri Bulma

2'den √n'ye kadar yineleyin ve bölünebilirliği kontrol edin. n, mevcut aday tarafından bölünebiliyorsa, bölme işlemini yapın ve yazdırın.

Örnek: 40'tan büyük her asal sayı n'ye uyar2+n+41, yani n = 0, 1, 2, 41, 43, 47 sonuçlarını verir.

Bir sayının asal çarpanı nasıl yazdırılır?

  • 2'den √n'ye kadar olan sayıları yineleyin.
  • Her bir aday için n'nin mutlak değerini kontrol edin; sıfır kalan, adayın asal çarpan olduğu anlamına gelir.
  • n'yi bölen tüm asal sayıları toplayın.
  • Bu rutin O(sqrt(n)) zaman karmaşıklığında çalışır.

Algoritma:

Set a counter i to 2
While i <= sqrt(n):
    While n % i == 0:
        n = n / i
        print i
    i = i + 1
if n > 1:
    print n

Elek Algoritması

Elek yöntemi, her sayının en küçük asal çarpanını maksimum bir sınıra kadar saklayarak, ön hesaplama sonrasında çarpanlara ayırma maliyetini önemli ölçüde azaltır.

  • En yüksek sınıra kadar olan her tamsayının en küçük asal çarpanını kaydedin.
  • En küçük asal sayıyı alın ve çarpanlar kümesine ekleyin.
  • Sayıyı o asal sayıya bölün ve 1'e ulaşana kadar tekrarlayın.
  • Her sorgu yaklaşık O(log n) sürede çalışır.

Örnek: 2 ve 3 dışında bir asal sayı 6n-1 veya 6n+1 biçimine uyar. Örneğin, 5 = 6(1)-1 ve 19 = 6(3)+1.

Algoritma: bir tanımla dizi Her sayının en küçük asal çarpanını, her eleman için başlangıç ​​değeri olarak indeksi kullanarak saklayan bir fonksiyondur.

Set array[1] to 1
Set i to 2
While i*i <= max_number:
    If array[i] == i:
        Set j to i*i
        While j <= max_number:
            If array[j] == j:
                array[j] = i
            j = j + i
    i = i + 1
while the_number != 1:
    print array[the_number]
    the_number = the_number / array[the_number]

İlgili Makaleler

Python Yinelemeyi Kullanan Asal Faktörler

Aşağıdaki Python Bu kod, yinelemeli deneme-bölme yöntemini kullanarak asal çarpanları bulur:

import math
def PrimeFactors(n):
    for i in range(2, int(math.sqrt(n)) + 1, 1):
        while n % i == 0:  # find all the occurrences of a prime factor
            print((int)(i))
            n = n // i
    if n != 1:  # if the number was originally a prime
        print((int)(n))
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

Çıktı:

Enter the number you want: 4
2
2

Python Özyinelemeyi Kullanan Asal Faktörler

MKS Python Aşağıdaki kod, verilen bir sayının asal çarpanlarını bulmak için elek yöntemini kullanır.

import math
High = (int)(1e5 + 7)
array = [0 for i in range(High)]

# generate smallest prime factors
def Sieve():
    for i in range(1, High):
        array[i] = i
    for i in range(2, math.ceil(math.sqrt(High))):
        if array[i] == i:
            for j in range(i * i, High, i):
                if array[j] == j:
                    array[j] = i

def PrimeFactors(n):  # divide until we reach 1
    if n == 1:
        return
    print((int)(array[n]))
    PrimeFactors((int)(n / array[n]))

Sieve()
n = (int)(input("Enter the number you want: "))
PrimeFactors(n)

Çıktı:

Enter the number you want: 4
2
2

Yinelemeyi Kullanan C Prime Factors Programı

Aynı yinelemeli çözüm şu şekilde yazılmıştır: C: Bir sayı girin, ardından 2'den √n'ye kadar her aday için bölünebilirliği kontrol edin ve asal çarpanların her geçtiği yeri yazdırın.

#include <stdio.h>
int main()
{
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    for (int i = 2; i * i <= n; i++)
    {
        while (n % i == 0)  // find all the occurrences of a prime factor
        {
            printf("%d\n", i);
            n /= i;
        }
    }
    if (n != 1)  // if the number was originally a prime
    {
        printf("%d", n);
    }
    return 0;
}

Çıktı:

Enter the number you want: 2
2

Özyinelemeyi Kullanan C Asal Faktörler Programı

Özyinelemeyi Kullanan C Asal Faktörler Programı

Özyinelemeli C sürümü şunu yansıtır: Python Birinci adım: En küçük asal çarpanların dizisini oluşturun, ardından n 1'e ulaşana kadar bu çarpana bölme işlemini yineleyin.

#include <stdio.h>
int Max = 100007;
int array[100007];

void Sieve()  // smallest prime factors up to Max
{
    for (int i = 1; i < Max; i++)
        array[i] = i;
    for (int i = 2; i * i <= Max; i++)
    {
        if (array[i] == i)
        {
            for (int j = i * i; j < Max; j += i)
            {
                if (array[j] == j)
                    array[j] = i;
            }
        }
    }
}

void PrimeFactors(int n)
{
    if (n == 1)  // divide until we reach 1
        return;
    printf("%d\n", array[n]);
    PrimeFactors(n / array[n]);
}

int main()
{
    Sieve();
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    PrimeFactors(n);
    return 0;
}

Çıktı:

Enter the number you want: 2
2

Asal sayılar hakkında bazı ilginç gerçekler

  • 2 dışında herhangi bir çift sayı, iki asal sayının toplamı olarak yazılabilir (4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3).
  • 2 ve 3 dışında ardışık asal sayı yoktur, çünkü 2 tek çift asal sayıdır.
  • 2 ve 3 hariç tüm asal sayılar, n pozitif bir tamsayı olmak üzere, 6n + 1 veya 6n − 1 biçimine uyar.
  • Bir sayının asal çarpanlarının kümesi tektir.
  • 1 sayısı ne asal ne de bileşik sayıdır.
  • Asal çarpanlara ayırma, bölünebilirlik, kesirlerin sadeleştirilmesi ve ortak paydaların bulunmasına yardımcı olur.
  • Asal çarpanlara ayırma, sayı tabanlı kriptografik kodların da temelini oluşturur.

SSS

Asal çarpanlara ayırma, bir tam sayıyı asal sayıların çarpımına ayırır; örneğin 12 = 2 × 2 × 3. Asal çarpanlar, birden büyük her tam sayı için benzersizdir.

Eğer n'nin √n'den büyük bir çarpanı varsa, onun eşi daha küçüktür ve zaten bulunmuş olur. √n'den sonraki her şey aynı işlemi tekrarlar.

Deneme bölme işlemi O(sqrt(n)) sürede çalışır. Elek algoritması en küçük asal çarpanları O(N log log N) sürede önceden hesaplar, ardından her çarpanlara ayırma işlemini yaklaşık O(log n) sürede yanıtlar.

Üst sınırı bilinen birçok sayıyı çarpanlarına ayırırken elek yöntemini kullanın. Bir ön hesaplama, daha sonraki her sorgunun yaklaşık O(log n) sürede çalışmasını sağlar.

Hayır. 1 sayısı ne asal ne de bileşik sayıdır, bu nedenle asal çarpanlar listesinde asla yer almaz. Asal çarpanlara ayırma işlemi, 2'den büyük veya 2'ye eşit asal sayılar kullanılarak yapılır.

Asal çarpanlara ayırma, bölünebilirlik testlerini, kesir sadeleştirmeyi, EKOK ve EBOB'u ve iki asal sayının büyük bir çarpımını çarpanlarına ayırmanın zor olduğu RSA gibi açık anahtarlı şifrelemeyi yönlendirir.

Yapay zekâ sistemleri, asal çarpanlara ayırma yöntemini sayı kuramsal özelliklere, kriptografik anahtar analizine ve güvenli birleşik öğrenmeye uygular. Kuantum sonrası makine öğrenimi araştırmaları ayrıca çarpanlara ayırmaya karşı direnci de inceler.

Evet. GitHub Copilot ve benzeri yapay zeka asistanları, deneme bölme ve eleme rutinleri için tekrarlayan kodları otomatikleştirir; ancak geliştiriciler yine de karmaşıklığı ve n = 1 gibi uç durumları doğrulamalıdır.

Bu yazıyı şu şekilde özetleyin: