Algorytm znajdowania największego czynnika pierwszego liczby

Jakie jest najlepsze podejście do obliczania największego czynnika pierwszego liczby?

Myślę, że najskuteczniejsze byłoby:

  1. Znajdź najniższą liczbę pierwszą, która dzieli czysto
  2. Sprawdź czy wynik podziału jest pierwszy
  3. Jeśli nie, Znajdź następny najniższy
  4. idź do 2.

Opieram to założenie na tym, że łatwiej jest obliczyć małe czynniki pierwsze. Czy to prawda? Jakie inne podejścia powinienem szukać do?

Edit: zdałem sobie sprawę, że moje podejście jest daremne, jeśli w grze jest więcej niż 2 czynniki pierwsze, ponieważ Krok 2 zawodzi, gdy wynik jest iloczynem dwóch innych liczb pierwszych, dlatego potrzebny jest algorytm rekurencyjny.

Edit again: I teraz zdałem sobie sprawę, że to nadal działa, ponieważ ostatnia znaleziona liczba pierwsza musi być najwyższa, dlatego Wszelkie dalsze testy wyniku Nie-pierwszego z kroku 2 spowodowałyby mniejszą liczbę pierwszą.

Author: smci, 2008-08-22

27 answers

W rzeczywistości istnieje kilka bardziej efektywnych sposobów na znalezienie czynników o dużych liczbach (dla mniejszych podział prób działa dość dobrze).

Jedna metoda, która jest bardzo szybka, jeśli liczba wejściowa ma dwa czynniki bardzo zbliżone do jej pierwiastka kwadratowego, jest znana jako Faktoryzacja Fermata . Wykorzystuje tożsamość N = (A + b) (a - b) = a^2-b^2 i jest łatwy do zrozumienia i wdrożenia. Niestety nie jest to bardzo szybkie w ogóle.

Najbardziej znana metoda faktoringu liczb w górę do 100 cyfr długości jest Sita kwadratowego . Jako bonus, część algorytmu jest łatwo zrobić z przetwarzania równoległego.

Kolejny algorytm, o którym słyszałem, to algorytm Rho Pollarda . Nie jest tak wydajny jak sito kwadratowe w ogóle, ale wydaje się być łatwiejsze do wdrożenia.


Gdy już zdecydujesz, jak podzielić liczbę na dwa czynniki, oto najszybszy algorytm, jaki przychodzi mi do głowy, aby znaleźć największy czynnik pierwszy liczby:

Create a Kolejka priorytetowa, która początkowo przechowuje sam numer. Każda iteracja usuwa najwyższą liczbę z kolejki i próbuje podzielić ją na dwa czynniki (oczywiście nie pozwalając, aby 1 był jednym z tych czynników). Jeśli ten krok się nie powiedzie, liczba jest pierwsza i masz swoją odpowiedź! W przeciwnym razie dodajesz dwa czynniki do kolejki i powtarzasz.

 126
Author: Artelius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 08:23:46

Oto najlepszy algorytm jaki znam (w Pythonie)

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1

    return factors


pfs = prime_factors(1000)
largest_prime_factor = max(pfs) # The largest element in the prime factor list

Powyższa metoda działa w O(n) w najgorszym przypadku (gdy wejście jest liczbą pierwszą).

EDIT:
Poniżej znajduje się wersja O(sqrt(n)), zgodnie z sugestią w komentarzu. Oto Kod, jeszcze raz.

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    d = 2
    while n > 1:
        while n % d == 0:
            factors.append(d)
            n /= d
        d = d + 1
        if d*d > n:
            if n > 1: factors.append(n)
            break
    return factors


pfs = prime_factors(1000)
largest_prime_factor = max(pfs) # The largest element in the prime factor list
 126
Author: Triptych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 03:35:11

Moja odpowiedź opiera się na tryptyku ' s, ale znacznie poprawia na nim. Opiera się ona na tym, że poza 2 i 3 wszystkie liczby pierwsze mają postać 6n-1 lub 6n+1.

var largestPrimeFactor;
if(n mod 2 == 0)
{
    largestPrimeFactor = 2;
    n = n / 2 while(n mod 2 == 0);
}
if(n mod 3 == 0)
{
    largestPrimeFactor = 3;
    n = n / 3 while(n mod 3 == 0);
}

multOfSix = 6;
while(multOfSix - 1 <= n)
{
    if(n mod (multOfSix - 1) == 0)
    {
        largestPrimeFactor = multOfSix - 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }

    if(n mod (multOfSix + 1) == 0)
    {
        largestPrimeFactor = multOfSix + 1;
        n = n / largestPrimeFactor while(n mod largestPrimeFactor == 0);
    }
    multOfSix += 6;
}

Niedawno napisałem artykuł na blogu wyjaśniający, jak działa ten algorytm.

Zaryzykowałbym, że metoda, w której nie ma potrzeby badania na prymat (i nie ma konstrukcji sita) będzie działać szybciej niż ta, która ich używa. Jeśli tak jest, jest to prawdopodobnie najszybszy algorytm tutaj.

 17
Author: sundar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:54

Wszystkie liczby można wyrazić jako iloczyn liczb pierwszych, np.:

102 = 2 x 3 x 17
712 = 2 x 2 x 2 x 89

Możesz je znaleźć po prostu zaczynając od 2 i po prostu kontynuując dzielenie, aż wynik nie będzie wielokrotnością Twojej liczby:

712 / 2 = 356 .. 356 / 2 = 178 .. 178 / 2 = 89 .. 89 / 89 = 1

Używając tej metody nie musisz obliczać żadnych liczb pierwszych: wszystkie będą liczbami pierwszymi, bazując na fakcie, że już obliczyłeś liczbę tak bardzo, jak to możliwe, ze wszystkimi liczbami poprzedzającymi.

number = 712;
currNum = number;    // the value we'll actually be working with
for (currFactor in 2 .. number) {
    while (currNum % currFactor == 0) {
        // keep on dividing by this number until we can divide no more!
        currNum = currNum / currFactor     // reduce the currNum
    }
    if (currNum == 1) return currFactor;    // once it hits 1, we're done.
}
 4
Author: nickf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-28 05:06:53
    //this method skips unnecessary trial divisions and makes 
    //trial division more feasible for finding large primes

    public static void main(String[] args) 
    {
        long n= 1000000000039L; //this is a large prime number 
        long i = 2L;
        int test = 0;

        while (n > 1)
        {
            while (n % i == 0)
            {
                n /= i;     
            }

            i++;

            if(i*i > n && n > 1) 
            {
                System.out.println(n); //prints n if it's prime
                test = 1;
                break;
            }
        }

        if (test == 0)  
            System.out.println(i-1); //prints n if it's the largest prime factor
    }
 4
Author: the_prole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-22 16:50:45

Kod JavaScript:

'option strict';

function largestPrimeFactor(val, divisor = 2) { 
    let square = (val) => Math.pow(val, 2);

    while ((val % divisor) != 0 && square(divisor) <= val) {
        divisor++;
    }

    return square(divisor) <= val
        ? largestPrimeFactor(val / divisor, divisor)
        : val;
}

Przykład Użycia:

let result = largestPrimeFactor(600851475143);

Oto przykład kodu :

 4
Author: Vlad Bezden,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 15:54:37

Podobne do @ tryptyk odpowiedz, ale też inne. W tym przykładzie lista lub słownik nie jest używany. Kod jest napisany w Ruby

def largest_prime_factor(number)
  i = 2
  while number > 1
    if number % i == 0
      number /= i;
      i -= 1
    end
    i += 1
  end
  return i
end

largest_prime_factor(600851475143)
# => 6857
 4
Author: Ugnius Malūkas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-19 08:53:03

Najprostszym rozwiązaniem jest para wzajemnie rekurencyjnych funkcji.

Pierwsza funkcja generuje wszystkie liczby pierwsze:

  1. zacznij od listy, która składa się z 2 i wszystkich liczb nieparzystych większych niż 2.
  2. Usuń wszystkie liczby, które nie są pierwsze. Oznacza to liczby, które nie mają czynników pierwszych (innych niż same siebie). Patrz poniżej.

Druga funkcja zwraca czynniki pierwsze danej liczby n w porządku rosnącym. Strategia jest to próba podzielenia n przez każdą liczbę pierwszą, która mogłaby być jej dzielnikiem:

  1. weź listę wszystkich liczb pierwszych w rosnącej kolejności(patrz wyżej).
  2. niech p będzie liczbą pierwszą z tej listy, a {[4] } będzie liczbą pierwszą z n/p (Zobacz Krok 1).
    • Jeśli p kwadrat jest większy od naszej liczby n, to n jest liczbą pierwszą. Skończyliśmy.
    • Jeśli p dzieli n, to p jest czynnikiem pierwszorzędowym n. Pozostałe czynniki to ps.
    • inaczej p nie jest pierwszy czynnik n.

Największym współczynnikiem pierwszym n jest ostatnia liczba podana przez drugą funkcję.

Dla wyjaśnienia, oto kod dla powyższego, w Haskell:

import Control.Monad

-- All the primes
primes = 2 : filter (ap (<=) (head . primeFactors)) [3,5..]

-- Gives the prime factors of its argument
primeFactors = factor primes
  where factor [] n = []
        factor xs@(p:ps) n =
          if p*p > n then [n]
          else let (d,r) = divMod n p in
            if r == 0 then p : factor xs d
            else factor ps n

-- Gives the largest prime factor of its argument
largestFactor = last . primeFactors
 3
Author: Apocalisp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-24 18:38:06
n = abs(number);
result = 1;
if (n mod 2 == 0) {
  result = 2;
  while (n mod 2 = 0) n /= 2;
}
for(i=3; i<sqrt(n); i+=2) {
  if (n mod i == 0) {
    result = i;
    while (n mod i = 0)  n /= i;
  }
}
return max(n,result)

Istnieją pewne testy modulo, które są superflous, ponieważ n nigdy nie może być dzielone przez 6, jeśli wszystkie czynniki 2 i 3 zostały usunięte. Możesz pozwolić tylko na primes dla i, co jest pokazane w kilku innych odpowiedzi tutaj.

Rzeczywiście można tu spleść sito Eratostenesa:

  • najpierw Utwórz listę liczb całkowitych w górę do sqrt (n).
  • W pętli for Zaznacz wszystkie wielokrotności i do nowego sqrt (n) jako nie prime i zamiast tego użyj pętli while.
  • set i to the następna liczba pierwsza w lista.

Zobacz też to pytanie.

 2
Author: Ralph M. Rickenbach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Wiem, że to nie jest szybkie rozwiązanie. Publikowanie jako miejmy nadzieję łatwiejsze do zrozumienia powolne rozwiązanie.

 public static long largestPrimeFactor(long n) {

        // largest composite factor must be smaller than sqrt
        long sqrt = (long)Math.ceil(Math.sqrt((double)n));

        long largest = -1;

        for(long i = 2; i <= sqrt; i++) {
            if(n % i == 0) {
                long test = largestPrimeFactor(n/i);
                if(test > largest) {
                    largest = test;
                }
            }
        }

        if(largest != -1) {
            return largest;
        }

        // number is prime
        return n;
    } 
 2
Author: thejosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 22:41:54

Podejście iteracyjne Pythona poprzez usunięcie wszystkich czynników pierwszych z liczby

def primef(n):
    if n <= 3:
        return n
    if n % 2 == 0:
        return primef(n/2)
    elif n % 3 ==0:
        return primef(n/3)
    else:
        for i in range(5, int((n)**0.5) + 1, 6):
            #print i
            if n % i == 0:
                return primef(n/i)
            if n % (i + 2) == 0:
                return primef(n/(i+2))
    return n
 1
Author: Jyothir Aditya Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-09 12:55:37

Używam algorytmu, który kontynuuje dzielenie liczby przez bieżący czynnik pierwszy.

Moje rozwiązanie w Pythonie 3:

def PrimeFactor(n):
    m = n
    while n%2==0:
        n = n//2
    if n == 1:         # check if only 2 is largest Prime Factor 
        return 2
    i = 3
    sqrt = int(m**(0.5))  # loop till square root of number
    last = 0              # to store last prime Factor i.e. Largest Prime Factor
    while i <= sqrt :
        while n%i == 0:
            n = n//i       # reduce the number by dividing it by it's Prime Factor
            last = i
        i+=2
    if n> last:            # the remaining number(n) is also Factor of number 
        return n
    else:
        return last
print(PrimeFactor(int(input()))) 

Wejście: 10 Wyjście: 5

Wejście: 600851475143 Wyjście: 6857

 1
Author: Kalpesh Dusane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 06:26:10

Oto moja próba w c#. Ostatni wydruk jest największym pierwszym czynnikiem liczby. Sprawdziłam i działa.

namespace Problem_Prime
{
  class Program
  {
    static void Main(string[] args)
    {
      /*
       The prime factors of 13195 are 5, 7, 13 and 29.

      What is the largest prime factor of the number 600851475143 ?
       */
      long x = 600851475143;
      long y = 2;
      while (y < x)
      {
        if (x % y == 0)
        {
          // y is a factor of x, but is it prime
          if (IsPrime(y))
          {
            Console.WriteLine(y);
          }
          x /= y;
        }

        y++;

      }
      Console.WriteLine(y);
      Console.ReadLine();
    }
    static bool IsPrime(long number)
    {
      //check for evenness
      if (number % 2 == 0)
      {
        if (number == 2)
        {
          return true;
        }
        return false;
      }
      //don't need to check past the square root
      long max = (long)Math.Sqrt(number);
      for (int i = 3; i <= max; i += 2)
      {
        if ((number % i) == 0)
        {
          return false;
        }
      }
      return true;
    }

  }
}
 0
Author: Seamus Barrett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-20 15:54:25
#python implementation
import math
n = 600851475143
i = 2
factors=set([])
while i<math.sqrt(n):
   while n%i==0:
       n=n/i
       factors.add(i)
   i+=1
factors.add(n)
largest=max(factors)
print factors
print largest
 0
Author: Rishabh Prasad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-31 20:57:01

Oblicza największy współczynnik liczby przy użyciu rekurencji w C++. Działanie kodu jest wyjaśnione poniżej:

int getLargestPrime(int number) {
    int factor = number; // assumes that the largest prime factor is the number itself
    for (int i = 2; (i*i) <= number; i++) { // iterates to the square root of the number till it finds the first(smallest) factor
        if (number % i == 0) { // checks if the current number(i) is a factor
            factor = max(i, number / i); // stores the larger number among the factors
            break; // breaks the loop on when a factor is found
        }
    }
    if (factor == number) // base case of recursion
        return number;
    return getLargestPrime(factor); // recursively calls itself
}
 0
Author: 4aRk Kn1gh7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-12 05:08:30

Oto moje podejście do szybkiego obliczenia największego czynnika pierwszego. Opiera się na fakcie, że zmodyfikowany x nie zawiera czynników niepierwszych. Aby to osiągnąć, dzielimy x, gdy tylko zostanie znaleziony czynnik. Następnie pozostaje tylko zwrócić największy czynnik. To byłoby już pierwsze.

Kod (Haskell):

f max' x i | i > x = max'
           | x `rem` i == 0 = f i (x `div` i) i  -- Divide x by its factor
           | otherwise = f max' x (i + 1)  -- Check for the next possible factor

g x = f 2 x 2
 0
Author: penkovsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-22 12:33:21

Poniższy algorytm C++ nie jest najlepszy, ale działa dla liczb poniżej miliarda i jest dość szybki

#include <iostream>
using namespace std;

// ------ is_prime ------
// Determines if the integer accepted is prime or not
bool is_prime(int n){
    int i,count=0;
    if(n==1 || n==2)
      return true;
    if(n%2==0)
      return false;
    for(i=1;i<=n;i++){
    if(n%i==0)
        count++;
    }
    if(count==2)
      return true;
    else
      return false;
 }
 // ------ nextPrime -------
 // Finds and returns the next prime number
 int nextPrime(int prime){
     bool a = false;
     while (a == false){
         prime++;
         if (is_prime(prime))
            a = true;
     }
  return prime;
 }
 // ----- M A I N ------
 int main(){

      int value = 13195;
      int prime = 2;
      bool done = false;

      while (done == false){
          if (value%prime == 0){
             value = value/prime;
             if (is_prime(value)){
                 done = true;
             }
          } else {
             prime = nextPrime(prime);
          }
      }
        cout << "Largest prime factor: " << value << endl;
 }
 0
Author: s.n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 16:09:44

Znalazłem to rozwiązanie w sieci przez "James Wang"

public static int getLargestPrime( int number) {

    if (number <= 1) return -1;

    for (int i = number - 1; i > 1; i--) {
        if (number % i == 0) {
            number = i;
        }
    }
    return number;
}
 0
Author: Babar Baig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 20:57:03

Współczynnik Prime przy użyciu Sitka:

#include <bits/stdc++.h>
using namespace std;
#define N 10001  
typedef long long ll;
bool visit[N];
vector<int> prime;

void sieve()
{
            memset( visit , 0 , sizeof(visit));
            for( int i=2;i<N;i++ )
            {
                if( visit[i] == 0)
                {
                    prime.push_back(i);
                    for( int j=i*2; j<N; j=j+i )
                    {
                        visit[j] = 1;
                    }
                }
            }   
}
void sol(long long n, vector<int>&prime)
{
            ll ans = n;
            for(int i=0; i<prime.size() || prime[i]>n; i++)
            {
                while(n%prime[i]==0)
                {
                    n=n/prime[i];
                    ans = prime[i];
                }
            }
            ans = max(ans, n);
            cout<<ans<<endl;
}
int main() 
{
           ll tc, n;
           sieve();

           cin>>n;
           sol(n, prime);

           return 0;
}
 0
Author: rashedcs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 10:41:37

Wydaje mi się, że krok # 2 danego algorytmu nie będzie aż tak skuteczny. Nie ma pan rozsądnych oczekiwań, że to jest pierwszorzędne.

Również poprzednia odpowiedź sugerująca, że Sita Eratostenesa są całkowicie błędne. Właśnie napisałem dwa programy na numer 123456789. Jeden opierał się na sitku, drugi opierał się na następującej:
1)  Test = 2 
2)  Current = Number to test 
3)  If Current Mod Test = 0 then  
3a)     Current = Current Div Test 
3b)     Largest = Test
3c)     Goto 3. 
4)  Inc(Test) 
5)  If Current < Test goto 4
6)  Return Largest
Ta wersja była 90x szybsza od Sita.

Rzecz w tym, że na nowoczesnych procesorach rodzaj operacji liczy się znacznie mniej niż liczba operacji, nie wspominając o tym, że powyższy algorytm może działać w pamięci podręcznej, Sito nie może. Sito wykorzystuje wiele operacji wykreślających wszystkie liczby złożone.

Zauważ również, że mój podział czynników, jak są one zidentyfikowane zmniejsza przestrzeń, która musi być badana.

 -1
Author: Loren Pechtel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-28 05:40:45

Oblicz listę zawierającą pierwsze liczby, np. 2 3 5 7 11 13 ...

Za każdym razem, gdy faktoryzujesz liczbę pierwszą, używaj implementacji przez tryptyk, ale iterację tej listy liczb pierwszych zamiast naturalnych liczb całkowitych.

 -1
Author: guoger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 23:09:49

Z Javą:

Dla int wartości:

public static int[] primeFactors(int value) {
    int[] a = new int[31];
    int i = 0, j;
    int num = value;
    while (num % 2 == 0) {
        a[i++] = 2;
        num /= 2;
    }
    j = 3;
    while (j <= Math.sqrt(num) + 1) {
        if (num % j == 0) {
            a[i++] = j;
            num /= j;
        } else {
            j += 2;
        }
    }
    if (num > 1) {
        a[i++] = num;
    }
    int[] b = Arrays.copyOf(a, i);
    return b;
}

Dla long wartości:

static long[] getFactors(long value) {
    long[] a = new long[63];
    int i = 0;
    long num = value;
    while (num % 2 == 0) {
        a[i++] = 2;
        num /= 2;
    }
    long j = 3;
    while (j <= Math.sqrt(num) + 1) {
        if (num % j == 0) {
            a[i++] = j;
            num /= j;
        } else {
            j += 2;
        }
    }
    if (num > 1) {
        a[i++] = num;
    }
    long[] b = Arrays.copyOf(a, i);
    return b;
}
 -1
Author: Paul Vargas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-11 19:26:54

Prawdopodobnie nie zawsze jest to szybsze, ale bardziej optymistyczne co do tego, że można znaleźć duży dzielnik prime:

  1. N to twoja liczba
  2. jeśli jest pierwsza to return(N)
  3. Oblicz liczby pierwsze do Sqrt(N)
  4. przejdź przez liczby pierwsze w kolejności malejącej (największa pierwsza)
    • If N is divisible by Prime then Return(Prime)

Edit: w kroku 3 możesz użyć sita Eratostenesa lub Sita Atkinsa lub cokolwiek chcesz, ale samo sito nie znajdzie Cię największy czynnik pierwszorzędny. (Dlatego nie wybrałbym postu SQLMenace jako oficjalnej odpowiedzi...)

 -2
Author: palotasb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 20:45:14

Myślę, że byłoby dobrze, aby zapisać gdzieś wszystkie możliwe liczby pierwsze mniejsze niż n i po prostu iterować przez nie, aby znaleźć największy dzielnik. Możesz uzyskać liczby pierwsze z prime-numbers.org .

Oczywiście zakładam, że Twój numer nie jest zbyt duży:)

 -3
Author: Klesk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-22 19:57:15

Nie najszybszy, ale działa!

    static bool IsPrime(long num)
    {
        long checkUpTo = (long)Math.Ceiling(Math.Sqrt(num));
        for (long i = 2; i <= checkUpTo; i++)
        {
            if (num % i == 0)
                return false;
        }
        return true;
    }
 -3
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-27 20:48:47

Tutaj jest ta sama funkcja @ tryptyk dostarczana jako generator, która również została nieco uproszczona.

def primes(n):
    d = 2
    while (n > 1):
        while (n%d==0):
            yield d
            n /= d
        d += 1

Max prime można następnie znaleźć za pomocą:

n= 373764623
max(primes(n))

I lista czynników znalezionych za pomocą:

list(primes(n))
 -3
Author: pedram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 18:56:12
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include <time.h>

factor(long int n)
{
long int i,j;
while(n>=4)
 {
if(n%2==0) {  n=n/2;   i=2;   }

 else
 { i=3;
j=0;
  while(j==0)
  {
   if(n%i==0)
   {j=1;
   n=n/i;
   }
   i=i+2;
  }
 i-=2;
 }
 }
return i;
 }

 void main()
 { 
  clock_t start = clock();
  long int n,sp;
  clrscr();
  printf("enter value of n");
  scanf("%ld",&n);
  sp=factor(n);
  printf("largest prime factor is %ld",sp);

  printf("Time elapsed: %f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
  getch();
 }
 -6
Author: Chitransh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-08 17:23:59