Un problème de nombre premier qui apparaîtra certainement sur presque tous les sites lorsque vous participez à une programmation compétitive. Puisqu'il y a des cas où un nombre premier est obtenu pour un entier spécifié ou moins, qu'il s'agisse d'un certain entier ou d'un nombre premier, et qu'il est parfois nécessaire d'effectuer une décomposition en facteurs premiers, il est nécessaire de traiter chacun. Il existe une classe «Prime» dans Ruby, mais elle n'est pas utilisée ici.
Réalisé avec "tamis Eratostenes".
On dit que l'algorithme lui-même pour trouver les nombres premiers existe depuis la Grèce antique. [Wikipédia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%A9%E3%83%88%E3%82%B9%E3%83%86%E3%83 L'explication de% 8D% E3% 82% B9% E3% 81% AE% E7% AF% A9) est très facile à comprendre. Là, on rencontre aussi le principe d'exclusion (théorème des nombres). Un exemple d'utilisation du principe d'inclusion est décrit ici [http://qiita.com/hiroykam/items/3886d6a213cd593fdfab).
Produit des nombres premiers pour les entiers positifs de 1 000 ou moins. Pour plus de commodité, les deux méthodes créent un tableau avec des éléments jusqu'à 1001 afin de pouvoir déterminer s'il s'agit d'un nombre premier ou non.
def prime(maximum):
    sieve = [True] * maximum
    def sieved(prime):
        for not_prime in range(prime + prime, len(sieve), prime):
            sieve[not_prime] = False
    sieve[0] = sieve[1] = False
    sieved(2)
    for x in range(3, int(maximum ** 0.5) + 1, 2):
        if sieve[x]: sieved(x)
    return [prime for prime, is_prime in enumerate(sieve) if is_prime]
if __name__ == '__main__':
    print(prime(1001))
Créé à partir du code Python 3.
def prime(maximum)
  sieve = Array.new(maximum, true)
  sieved = lambda do |prime|
    ((prime + prime)..sieve.length).step(prime).each do |not_prime|
      sieve[not_prime] = false
    end
  end
  sieve[0], sieve[1] = false, false
  sieved.call(2)
  (3..(maximum ** 2).to_i).step(2).each do |x|
    sieved.call(x) if sieve[x]
  end
  sieve
end
prime(10001).each_with_index do |f, x|
  p x if f
end
Créé à partir du code Python 3.
<?php
function prime(int $maximum) : array {
    $sieve = [];
    $sieve[0] = $sieve[1] = false;
    array_walk(range(2, $maximum - 1), function ($i) use(&$sieve) { $sieve[$i] = true; });
    $sieved = function (int $prime) use(&$sieve) : void {
        array_walk(range($prime + $prime, count($sieve) - 1, $prime),  function($not_prime) use(&$sieve) : void {
            $sieve[$not_prime] = false;
        });
    };
    $sieved(2);
    array_walk(range(3, intval($maximum ** 0.5), 2), function ($x) use(&$sieve, $sieved) : void {
        if ($sieve[$x]) $sieved($x);
    });
    return array_filter($sieve);
}
array_walk(array_keys(prime(1001)), function ($prime) { print($prime. PHP_EOL); });
Créé à partir du code Python 3.
package main
import (
	"fmt"
    "math"
)
func prime(maximum int) [] bool {
	sieve := make([]bool, maximum)
	for i := range sieve {
		sieve[i] = true
	}
	sieved := func(prime int) {
		for i := prime + prime; i < maximum; i += prime {
			sieve[i] = false
		}
	}
	sieve[0] = false; sieve[1] = false
	sieved(2)
	end := int(math.Pow(float64(maximum), 0.5) + 1)
	for i := 3; i < end; i += 2 {
		if sieve[i] {
			sieved(i)
		}
	}
	return sieve
}
func main() {
	maximum := 1001
	print_prime := func () {
		for value, is_prime := range prime(maximum) {
			if is_prime {
				fmt.Printf("%v\n", value)
			}
		}
	}
	print_prime()
}
Il est possible d'utiliser le code ci-dessus en utilisant le tamis Eratostenes, mais il y a aussi un calcul supplémentaire, donc les performances ne sont pas bonnes dans ce cas. Par conséquent, considérons l'algorithme.
def is_prime(n):
    if n < 2:
        return False
    if n == 2 or n == 3 or n == 5:
        return True
    if not n & 1:
        return False
    if n % 2 == 0 or n % 3 == 0 or n % 5 == 0:
        return False
    f, v, m = True, 7, int(n ** 0.5) + 1
    while v < m:
        if n % v == 0: return False
        v += 4 if f else 2
        f = not f
    return True
if __name__ == '__main__':
    print(is_prime(4993)) # True
def prime?(n)
  if n < 2
    false
  elsif n == 2 || n == 3 || n == 5 then true
  elsif n & 1 == 0 then false
  elsif n % 2 == 0 || n % 3 == 0 || n % 5 == 0 then false
  else
    f, v, m = true, 7, (n ** 0.5).to_i + 1
    while v < m do
      if n % v == 0
        false
        return
      end
      v += f ? 4 : 2
      f = !f
    end
    true
  end
end
p prime?(4993) # -> true
php7.1
<?php
function is_prime(int $n) : bool {
    $r = true;
    if ($n < 2) $r = false;
    elseif ($n == 2 || $n == 3 || $n == 5) $r = true;
    elseif ($n & 1 == 0) $r = false;
    elseif ($n % 2 == 0 || $n % 3 == 0 || $n % 5 == 0) $r = false;
    else {
        $f = true;
        $v = 7;
        $m = intval($n ** 0.5) + 1;
        while ($v < $m) {
            if ($n % $v == 0) {
                $r = false;
                break;
            }
            $v += $f ? 4 : 2;
            $f = !$f;
        }
    }
    return $r;
}
print(is_prime(4993) ? "true" : "false");
package main
import (
    "fmt"
    "math"
)
func is_prime(n int) bool {
    switch {
    case n < 2:
       return false
    case n == 2 || n == 3 || n == 5:
       return true
    case n & 1 == 0:
       return false
    case n % 2 == 0 || n % 3 == 0 || n % 5 == 0:
       return false
    }
    
    f := true
    v := 7
    m := int(math.Pow(float64(n), 0.5)) + 1
    for v < m {
        if n % v == 0 {
            return false
        }
        if f {
            v += 4
        } else {
            v += 2
        }
        f = !f
    }
    return true
}
func main() {
    fmt.Print(is_prime(4993))  // true
}
Je n'ai presque aucune expérience de son utilisation, mais comme il est lié aux nombres premiers, je vais essayer de réaliser chacun.
Python a SymPy, mais stackoverflow ) A été réalisé par la méthode répondue en.
def prime_factors(n):
    i, factors = 2, []
    while i * i <= n:
        if n % i:
            i += 1
        else:
            n /= i
            factors.append(i)
    if n > 1:
        factors.append(n)
    return factors
if __name__ == '__main__':
    print(prime_factors(1200))  # [2, 2, 2, 2, 3, 5, 5]
def prime_factor(n)
  i, factors = 2, []
  while i * i <= n do
    if n % i != 0
      i += 1
    else
      n /= i
      factors.push(i)
    end
  end
  if n > 1
    factors.push(n)
  end
  factors
end
p prime_factor(1200) # -> [2, 2, 2, 2, 3, 5, 5]
<?php
function prime_factors(int $n) : array {
    $i = 2;
    $factors = [];
    while ($i * $i <= $n) {
        if ($n % $i) $i += 1;
        else {
            $n /= $i;
            $factors[] = $i;
        }
    }
    if ($n > 1) $factors[] = $n;
    return $factors;
}
print_r(prime_factors(1200)); // [2, 2, 2, 2, 3, 5, 5]
package main
import "fmt"
func prime_factors(n int) [] int {
    factors := make([]int, 0)
    i := 2
    for i * i <= n {
        r := n % i
        if r != 0 {
            i += 1
        } else if r == 0 {
            n /= i
            factors = append(factors, i)
        }
    }
    if n > 1 {
        factors = append(factors, n)
    }
    return factors
}
func main() {
    fmt.Print(prime_factors(1200))  // [2 2 2 2 3 5 5]
}
        Recommended Posts