Alkutekijän algoritmi: C, Python esimerkki

Mikä on ensisijainen faktorointi?

Tiedon alkutekijä Kaikki numero on tekijä, joka on a alkuluku. Kertomalla kertoimet antavat sinulle toisen luvun. Alkuluku on jaollinen itsellään tai 1:llä.

Toisin sanoen alkutekijät määritetään etsimällä, mitkä alkuluvut kertovat yhdessä muodostaen alkuperäisen luvun.

esimerkki: 10:n alkutekijät ovat 2 ja 5. Tämä johtuu siitä, että 2X5 =10 ja molemmat 2,5 ovat alkulukuja.

Ensisijaisten tekijöiden löytäminen iteraatiolla

Tietyn luvun alkutekijöiden löytämiseksi iteroimme ensin kaikki luvut luvusta 2 luvun neliöjuureen ja tarkistamme sitten, ovatko jokainen luku alkuluku. Niin kauan kuin alkuperäinen luku on jaettavissa tällä alkuluvulla, lisäämme tämän alkuluvun jokaisen iteroinnin yhteydessä.

Esimerkiksi:

Jokainen alkuluku, joka on suurempi kuin 40, kirjoitetaan seuraavaan kaavaan: n2+n+41. Voimme siis korvata n:n kaikilla luvuilla löytääksemme vastaavan alkutekijän. esim 02+0+41=41, 12+1+41=43, 22+2+41=47,…

Kuinka tulostaa luvun alkutekijä?

  • Tässä menetelmässä toistamme numeroita 2:sta luvun neliöjuureen, kuten edellisessä osiossa mainittiin.
  • Tätä varten meidän on tarkistettava alkuperäisen luvun moduuli jokaisessa luvussa 2:sta n:n neliöjuureen.
  • Sitten löydämme luettelon alkuluvuista, jotka ovat n:n tekijöitä.
  • Tämä ratkaisu on O(Sqrt(n))-aikakompleksisuudessa.

algoritmi:

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

Seula-algoritmi

Seulamenetelmä perustuu lukujen pienimmän alkutekijän tallentamiseen, mikä vähentää monimutkaisuutta huomattavasti laskettaessa minkä tahansa luvun alkutekijöitä. Seula-algoritmi löytää kaikki alkutekijät jokseenkin tehokkaasti.

  • Tämän algoritmin pääkonsepti on tallentaa kunkin luvun pienin alkutekijä maksiminumeroon asti.
  • Otetaan pienin alkuluku jokaiselle annetulle luvulle ja lisätään se alkutekijöiden joukkoon.
  • Lopuksi jaamme tällä alkuluvulla ja toistamme näitä vaiheita, kunnes saavutamme luvun 1.
  • Tämä kaikki tehdään O(log(n))-aikakompleksisuudessa, mikä parantaa ratkaisun tehokkuutta huomattavasti.
  • Tämä mahdollistaa paljon suurempien lukujen alkutekijöiden laskemisen kuin ne, joita olisimme voineet käsitellä edellisellä lähestymistavalla.

Esimerkiksi:

Toinen tapa on tarkistaa, voidaanko luku kirjoittaa muodossa 6n-1 tai 6n+1, koska mikä tahansa muu alkuluku kuin 2 ja 3 tulee kirjoittaa jompaankumpaan kaavasta. esim. 5=6(1)-1, 19=6(3)+1,… .

algoritmi:

Määritä taulukko, joka tallentaa kunkin luvun pienimmän alkutekijän indeksiarvon kanssa alkuarvona jokaiselle ryhmä.

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]

Python Ensisijaiset tekijät iteraatiolla

Tässä näytämme koodin Python kieli tietyn luvun alkutekijöiden löytämiseksi iteratiivisessa menetelmässä:

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)

lähtö:

Enter the number you want: 4
4

Python Ensisijaiset tekijät rekursiolla

Tässä osiossa näkyy koodi Python Kieli käyttämällä seulamenetelmää tietyn luvun alkutekijöiden löytämiseen.

import math
High = (int)(1e5+7)
array=[0 for i in range(High)]
# function to generate all the smallest prime 
def Sieve():
#factors of the numbers until the maximum  number
    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):
#We will keep dividing until we reach 1
    if n == 1:
        return
    print((int)(array[n]))
    PrimeFactors((int)(n/array[n]))
#Here we call the function after dividing it by this prime
Sieve()
n=(int)(input("Enter the number you want: "))
PrimeFactors(n)

lähtö:

Enter the number you want: 4
2
2

C Prime Factors -ohjelma käyttäen iteraatiota

Se on sama ratkaisu kuin iteratiivinen python, mutta kirjoitettu sisään C-kieli.

Pyydämme käyttäjää syöttämään numeron, minkä jälkeen meidän on tarkistettava jokaisen luvun välillä 2 neliöjuureen, onko se jaettavissa tulostamalla kaikki tämän tekijän esiintymät.

#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;
}

lähtö:

Enter the number you want: 2
2

C Prime Factors -ohjelma, jossa käytetään rekursiota

C Prime Factors -ohjelma, jossa käytetään rekursiota

Tämä on sama ratkaisu kuin pythonin rekursiivinen ratkaisu, mutta kirjoitettu C-kielellä.

Voimme pyytää käyttäjää syöttämään numeron; sitten rakennamme alkulukutaulukon, joka tallentaa kunkin luvun pienimmän alkutekijän. Lopuksi kutsutaan alkutekijöiden rekursiivista funktiota, joka jakaa annetun luvun pienimmällä alkutekijällä ja palauttaa itsensä takaisin, kunnes saavuttaa yhden.

#include <stdio.h>
int Max = 100007;
int array[100007];
void Sieve()//helping function to generate all the smallest //prime factors of the numbers until the maximum number
{
    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)//keep dividing until we reach 1
    {
        return;
    }
    printf("%d\n",array[n]);
    PrimeFactors(n/array[n]);//call the function after dividing by //this prime
}
int main()
{
    Sieve();
    int n;
    printf("Enter the number you want: ");
    scanf("%d", &n);
    PrimeFactors(n);
    return 0;
}

lähtö:

Enter the number you want: 2
2

Mielenkiintoisia faktoja alkuluvuista

  • Yksi mielenkiintoisimmista faktoista on, että mikä tahansa muu parillinen luku kuin 2 voi olla kahden alkuluvun summa.
  • Esimerkiksi: 4 = 2 + 2, 6 = 3 + 3, 8 = 5 + 3 … jne.
  • Toinen tosiasia on, että ei ole muita peräkkäisiä alkulukuja kuin 2 ja 3, koska ainoa parillinen alkuluku on luku 2.
  • Myös kaikki alkuluvut paitsi 2 ja 3 voidaan kirjoittaa seuraavassa muodossa: 6 * n + 1 tai 6 * n – 1, jossa n on positiivinen kokonaisluku.
  • Luvun alkutekijöiden joukko on ainutlaatuinen.
  • Numero 1 ei ole alkuluku eikä yhdistelmä.
  • Lukujen alkulukujen jakaminen voi auttaa ratkaisemaan ongelmia, kuten jaollisuus, murtolukujen yksinkertaistaminen ja eri murtolukujen yhteisten nimittäjien löytäminen.
  • Yksi prime factorisation jännittävistä käyttötavoista on myös lukuihin perustuvien salaisten koodien rikkominen.