Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Given a number n, we need to find the product of all prime numbers between 1 to n.
Examples:
Input: 5 Output: 30 Explanation: product of prime numbers between 1 to 5 is 2 * 3 * 5 = 30 Input : 7 Output : 210
Approach: Basic brute-force method
Steps:
- Initialize the product to be 1 and an empty list of primes.
- Iterate through all numbers i between 2 and n (inclusive).
- For each i, check if it is prime by iterating through all numbers j between 2 and i-1 (inclusive) and checking if i is divisible by j. If i is not divisible by any j, it is prime, so append i to the list of primes and multiply it with the running product.
- Return the product of all primes.
C++
#include <iostream>
#include <vector> // include vector library for storing prime numbers
using
namespace
std;
bool
is_prime(
int
num) {
if
(num < 2) {
return
false
;
}
for
(
int
i = 2; i < num; i++) {
if
(num % i == 0) {
return
false
;
}
}
return
true
;
}
int
product_of_primes(
int
n) {
int
product = 1;
vector<
int
> primes;
for
(
int
i = 2; i <= n; i++) {
if
(is_prime(i)) {
primes.push_back(i);
product *= i;
}
}
return
product;
}
int
main() {
cout << product_of_primes(5) << endl;
return
0;
}
Python3
def
is_prime(num):
if
num <
2
:
return
False
for
i
in
range
(
2
, num):
if
num
%
i
=
=
0
:
return
False
return
True
def
product_of_primes(n):
product
=
1
primes
=
[]
for
i
in
range
(
2
, n
+
1
):
if
is_prime(i):
primes.append(i)
product
*
=
i
return
product
print
(product_of_primes(
5
))
Javascript
function
is_prime(num) {
if
(num < 2) {
return
false
;
}
for
(let i = 2; i < num; i++) {
if
(num % i === 0) {
return
false
;
}
}
return
true
;
}
function
product_of_primes(n) {
let product = 1;
let primes = [];
for
(let i = 2; i <= n; i++) {
if
(is_prime(i)) {
primes.push(i);
product *= i;
}
}
return
product;
}
console.log(product_of_primes(5));
The time complexity of this approach is O(n^2).
The auxiliary space is O(n).
Efficient Approach:
Using Sieve of Eratosthenes to find all prime numbers from 1 to n then compute the product.
Following is the algorithm to find all the prime numbers less than or equal to a given integer n by Eratosthenes’ method:
When the algorithm terminates, all the numbers in the list that are not marked are prime and using a loop we compute the product of prime numbers.
C++
#include <bits/stdc++.h>
using
namespace
std;
long
ProdOfPrimes(
int
n)
{
bool
prime[n + 1];
memset
(prime,
true
, n + 1);
for
(
int
p = 2; p * p <= n; p++) {
if
(prime[p] ==
true
) {
for
(
int
i = p * 2; i <= n; i += p)
prime[i] =
false
;
}
}
long
prod = 1;
for
(
int
i = 2; i <= n; i++)
if
(prime[i])
prod *= i;
return
prod;
}
int
main()
{
int
n = 10;
cout << ProdOfPrimes(n);
return
0;
}
Java
import
java.util.Arrays;
class
GFG {
static
long
ProdOfPrimes(
int
n)
{
boolean
prime[]=
new
boolean
[n +
1
];
Arrays.fill(prime,
true
);
for
(
int
p =
2
; p * p <= n; p++) {
if
(prime[p] ==
true
) {
for
(
int
i = p *
2
; i <= n; i += p)
prime[i] =
false
;
}
}
long
prod =
1
;
for
(
int
i =
2
; i <= n; i++)
if
(prime[i])
prod *= i;
return
prod;
}
public
static
void
main (String[] args)
{
int
n =
10
;
System.out.print(ProdOfPrimes(n));
}
}
Python3
def
ProdOfPrimes(n):
prime
=
[
True
for
i
in
range
(n
+
1
)]
p
=
2
while
(p
*
p <
=
n):
if
(prime[p]
=
=
True
):
i
=
p
*
2
while
(i <
=
n):
prime[i]
=
False
i
+
=
p
p
+
=
1
prod
=
1
for
i
in
range
(
2
, n
+
1
):
if
(prime[i]):
prod
*
=
i
return
prod
n
=
10
print
(ProdOfPrimes(n))
C#
using
System;
public
class
GFG
{
static
long
ProdOfPrimes(
int
n)
{
bool
[]prime=
new
bool
[n + 1];
for
(
int
i = 0; i < n + 1; i++)
prime[i] =
true
;
for
(
int
p = 2; p * p <= n; p++) {
if
(prime[p] ==
true
) {
for
(
int
i = p * 2; i <= n; i += p)
prime[i] =
false
;
}
}
long
prod = 1;
for
(
int
i = 2; i <= n; i++)
if
(prime[i])
prod *= i;
return
prod;
}
public
static
void
Main ()
{
int
n = 10;
Console.Write(ProdOfPrimes(n));
}
}
PHP
<?php
function
ProdOfPrimes(
$n
)
{
$prime
=
array
();
for
(
$i
= 0;
$i
<
$n
+ 1;
$i
++)
$prime
[
$i
] = true;
for
(
$p
= 2;
$p
*
$p
<=
$n
;
$p
++)
{
if
(
$prime
[
$p
] == true)
{
for
(
$i
=
$p
* 2;
$i
<=
$n
;
$i
+=
$p
)
$prime
[
$i
] = false;
}
}
$prod
= 1;
for
(
$i
= 2;
$i
<=
$n
;
$i
++)
if
(
$prime
[
$i
])
$prod
*=
$i
;
return
$prod
;
}
$n
= 10;
echo
(ProdOfPrimes(
$n
));
?>
Javascript
<script>
function
ProdOfPrimes(n)
{
let prime =
new
Array(n + 1);
prime.fill(0);
for
(let i = 0; i < n + 1; i++)
prime[i] =
true
;
for
(let p = 2; p * p <= n; p++) {
if
(prime[p] ==
true
) {
for
(let i = p * 2; i <= n; i += p)
prime[i] =
false
;
}
}
let prod = 1;
for
(let i = 2; i <= n; i++)
if
(prime[i])
prod *= i;
return
prod;
}
let n = 10;
document.write(ProdOfPrimes(n));
</script>
Time Complexity: O(n log log n) // for sieve of erastosthenes
Auxiliary Space: O(N) //an extra array is used to store all the prime numbers hence algorithm takes up linear space
Last Updated :
25 Apr, 2023
Like Article
Save Article
Сайт переезжает. Большинство статей уже перенесено на новую версию.
Скоро добавим автоматические переходы, но пока обновленную версию этой статьи можно найти там.
Теория чисел
- Простые числа
- Разложение на простые множители
- Решето Эратосфена
- Линейное решето Эратосфена*
- НОД и НОК
- Алгоритм Евклида
- Расширенный алгоритм Евклида*
- Операции по модулю
- Быстрое возведение в степень
- Деление по простому модулю*
Простые числа
Простым называется натуральное число, которое делится только на единицу и на себя. Единица при этом простым числом не считается. Составным числом называют непростое число, которое еще и не единица.
Примеры простых чисел: (2), (3), (5), (179), (10^9+7), (10^9+9).
Примеры составных чисел: (4), (15), (2^{30}).
Еще одно определение простого числа: (N) — простое, если у (N) ровно два делителя. Эти делители при этом равны (1) и (N).
Проверка на простоту за линию
С точки зрения программирования интересно научиться проверять, является ли число (N) простым. Это очень легко сделать за (O(N)) – нужно просто проверить, делится ли оно хотя бы на одно из чисел (2, 3, 4, ldots, N-1) . (N > 1) является простым только в случае, если оно не делится на на одно из этих чисел.
def is_prime(n):
if n == 1:
return False
for i in range(2, n): # начинаем с 2, так как на 1 все делится; n не включается
if n % i == 0:
return False
return True
for i in range(1, 10):
print(i, is_prime(i))
(1, False)
(2, True)
(3, True)
(4, False)
(5, True)
(6, False)
(7, True)
(8, False)
(9, False)
Проверка на простоту за корень
Алгоритм можно ускорить с (O(N)) до (O(sqrt{N})).
Пусть (N = a times b), причем (a leq b). Тогда заметим, что (a leq sqrt N leq b).
Почему? Потому что если (a leq b < sqrt{N}), то (ab leq b^2 < N), но (ab = N). А если (sqrt{N} < a leq b), то (N < a^2 leq ab), но (ab = N).
Иными словами, если число (N) равно произведению двух других, то одно из них не больше корня из (N), а другое не меньше корня из (N).
Из этого следует, что если число (N) не делится ни на одно из чисел (2, 3, 4, ldots, lfloorsqrt{N}rfloor), то оно не делится и ни на одно из чисел (lceilsqrt{N}rceil + 1, ldots, N-2, N-1), так как если есть делитель больше корня (не равный (N)), то есть делитель и меньше корня (не равный 1). Поэтому в цикле for достаточно проверять числа не до (N), а до корня.
def is_prime(n):
if n == 1:
return False
# Удобно вместо for i in range(2, n ** 0.5) писать так:
i = 2
while i * i <= n:
if n % i == 0:
return False
i += 1
return True
for i in [1, 2, 3, 10, 11, 12, 10**9+6, 10**9+7]:
print(i, is_prime(i))
(1, False)
(2, True)
(3, True)
(10, False)
(11, True)
(12, False)
(1000000006, False)
(1000000007, True)
Разложение на простые множители
Любое натуральное число можно разложить на произведение простых, и с такой записью очень легко работать при решении задач. Разложение на простые множители еще называют факторизацией.
[11 = 11 = 11^1] [100 = 2 times 2 times 5 times 5 = 2^2 times 5^2] [126 = 2 times 3 times 3 times 7 = 2^1 times 3^2 times 7^1]
Рассмотрим, например, такую задачу:
Условие: Нужно разбить (N) людей на группы равного размера. Нам интересно, какие размеры это могут быть.
Решение: По сути нас просят найти число делителей (N). Нужно посмотреть на разложение числа (N) на простые множители, в общем виде оно выглядит так:
[N= p_1^{a_1} times p_2^{a_2} times ldots times p_k^{a_k}]
Теперь подумаем над этим выражением с точки зрения комбинаторики. Чтобы «сгенерировать» какой-нибудь делитель, нужно подставить в степень (i)-го простого число от 0 до (a_i) (то есть (a_i+1) различное значение), и так для каждого. То есть делитель (N) выглядит ровно так: [M= p_1^{b_1} times p_2^{b_2} times ldots times p_k^{b_k}, 0 leq b_i leq a_i] Значит, ответом будет произведение ((a_1+1) times (a_2+1) times ldots times (a_k + 1)).
Алгоритм разложения на простые множители
Применяя алгоритм проверки числа на простоту, мы умеем легко находить минимальный простой делитель числа N. Ясно, что как только мы нашли простой делитель числа (N), мы можем число (N) на него поделить и продолжить искать новый минимальный простой делитель.
Будем перебирать простой делитель от (2) до корня из (N) (как и раньше), но в случае, если (N) делится на этот делитель, будем просто на него делить. Причем, возможно, нам понадобится делить несколько раз ((N) может делиться на большую степень этого простого делителя). Так мы будем набирать простые делители и остановимся в тот момент, когда (N) стало либо (1), либо простым (и мы остановились, так как дошли до корня из него). Во втором случае надо еще само (N) добавить в ответ.
Напишем алгоритм факторизации:
def factorize(n):
factors = []
i = 2
while i * i <= n: # перебираем простой делитель
while n % i == 0: # пока N на него делится
n //= i # делим N на этот делитель
factors.append(i)
i += 1
# возможно, в конце N стало большим простым числом,
# у которого мы дошли до корня и поняли, что оно простое
# его тоже нужно добавить в разложение
if n > 1:
factors.append(n)
return factors
for i in [1, 2, 3, 10, 11, 12, 10**9+6, 10**9+7]:
print(i, '=', ' x '.join(str(x) for x in factorize(i)))
1 =
2 = 2
3 = 3
10 = 2 x 5
11 = 11
12 = 2 x 2 x 3
1000000006 = 2 x 500000003
1000000007 = 1000000007
Задание
За сколько работает этот алгоритм?
.
.
.
.
Решение
За те же самые (O(sqrt{N})). Итераций цикла while с перебором делителя будет не больше, чем (sqrt{N}). Причем ровно (sqrt{N}) операций будет только в том случае, если (N) – простое.
А итераций деления (N) на делители будет столько, сколько всего простых чисел в факторизации числа (N). Понятно, что это не больше, чем (O(log{N})).
Задание
Докажите, что число (N) имеет не больше, чем (O(log{N})) простых множителей в факторизации.
Разные свойства простых чисел*
Вообще, про простые числа известно много свойств, но почти все из них очень трудно доказать. Вот еще некоторые из них:
- Простых чисел, меньших (N), примерно (frac{N}{ln N}).
- N-ое простое число равно примерно (Nln N).
- Простые числа распределены более-менее равномерно. Например, если вам нужно найти какое-то простое число в промежутке, то можно их просто перебрать и проверить — через несколько сотен какое-нибудь найдется.
- Для любого (N ge 2) на интервале ((N, 2N)) всегда найдется простое число (Постулат Бертрана)
- Впрочем, существуют сколь угодно длинные отрезки, на которых простых чисел нет. Самый простой способ такой построить – это начать с (N! + 2).
- Есть алгоритмы, проверяющие число на простоту намного быстрее, чем за корень.
- Максимальное число делителей равно примерно (O(sqrt[3]{n})). Это не математический результат, а чисто эмпирический — не пишите его в асимптотиках.
- Максимальное число делителей у числа на отрезке ([1, 10^5]) — 128
- Максимальное число делителей у числа на отрекзке ([1, 10^9]) — 1344
- Максимальное число делителей у числа на отрезке ([1, 10^{18}]) — 103680
- Наука умеет факторизовать числа за (O(sqrt[4]{n})), но об этом как-нибудь в другой раз.
- Любое число больше трёх можно представить в виде суммы двух простых (гипотеза Гольдбаха), но это не доказано.
Решето Эратосфена
Часто нужно не проверять на простоту одно число, а найти все простые числа до (N). В этом случае наивный алгоритм будет работать за (O(Nsqrt N)), так как нужно проверить на простоту каждое число от 1 до (N).
Но древний грек Эратосфен предложил делать так:
Запишем ряд чисел от 1 до (N) и будем вычеркивать числа: * делящиеся на 2, кроме самого числа 2 * затем деляющиеся на 3, кроме самого числа 3 * затем на 5, затем на 7, и так далее и все остальные простые до n. Таким образом, все незачеркнутые числа будут простыми — «решето» оставит только их.
Красивая визуализация
Задание
Найдите этим способом на бумажке все простые числа до 50, потом проверьте с программой:
N = 50
prime = [1] * (N + 1)
prime[0], prime[1] = 0, 0
for i in range(2, N + 1): # можно и до sqrt(N)
if prime[i]:
for j in range(2 * i, N + 1, i): # идем с шагом i, можно начиная с i * i
prime[j] = 0
for i in range(1, N + 1):
if prime[i]:
print(i)
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
У этого алгоритма можно сразу заметить несколько ускорений.
Во-первых, число (i) имеет смысл перебирать только до корня из (N), потому что при зачеркивании составных чисел, делящихся на простое (i > sqrt N), мы ничего не зачеркнем. Почему? Пусть существует составное (M leq N), которое делится на %i%, и мы его не зачеркнули. Но тогда (i > sqrt N geq sqrt M), а значит по ранее нами доказанному утверждению (M) должно делиться и на простое число, которое меньше корня. Но это значит, что мы его уже вычеркнули.
Во-вторых, по этой же самое причине (j) имеет смысл перебирать только начиная с (i^2). Зачем вычеркивать (2i), (3i), (4i), …, ((i-1)i), если они все уже вычеркнуты, так как мы уже вычеркивали всё, что делится на (2), (3), (4), …, ((i-1)).
Асимптотика
Такой код будет работать за (O(N log log N)) по причинам, которые мы пока не хотим объяснять формально.
Гармонический ряд
Научимся оценивать асимптотику величины (1 + frac{1}{2} + ldots + frac{1}{N}), которая нередко встречается в задачах, где фигурирует делимость.
Возьмем (N) равное (2^i – 1) и запишем нашу сумму следующим образом: [left(frac{1}{1}right) + left(frac{1}{2} + frac{1}{3}right) + left(frac{1}{4} + ldots + frac{1}{7}right) + ldots + left(frac{1}{2^{i – 1}} + ldots + frac{1}{2^i – 1}right)]
Каждое из этих слагаемых имеет вид [frac{1}{2^j} + ldots + frac{1}{2^{j + 1} – 1} le frac{1}{2^j} + ldots + frac{1}{2^j} = 2^j frac{1}{2^j} = 1]
Таким образом, наша сумма не превосходит (1 + 1 + ldots + 1 = i le 2log_2(2^i – 1)). Тем самым, взяв любое (N) и дополнив до степени двойки, мы получили асимптотику (O(log N)).
Оценку снизу можно получить аналогичным образом, оценив каждое такое слагаемое снизу значением (frac{1}{2}).
Попытка объяснения асимптотики** (для старших классов)
Мы знаем, что гармонический ряд (1 + frac{1}{2} + frac{1}{3} + ldots + frac{1}{N}) это примерно (log N), а значит [N + frac{N}{2} + frac{N}{3} + ldots + frac{N}{N} sim N log N]
А что такое асимптотика решета Эратосфена? Мы как раз ровно (frac{N}{p}) раз зачеркиваем числа делящиеся на простое число (p). Если бы все числа были простыми, то мы бы как раз получили (N log N) из формули выше. Но у нас будут не все слагаемые оттуда, только с простым (p), поэтому посмотрим чуть более точно.
Известно, что простых чисел до (N) примерно (frac{N}{log N}), а значит допустим, что k-ое простое число примерно равно (k ln k). Тогда
[sum_{substack{2 leq p leq N \ text{p is prime}}} frac{N}{p} sim frac{1}{2} + sum_{k = 2}^{frac{N}{ln N}} frac{N}{k ln k} sim int_{2}^{frac{N}{ln N}} frac{N}{k ln k} dk =N(lnlnfrac{N}{ln N} – lnln 2) sim N(lnln N – lnlnln N) sim N lnln N]
Но вообще-то решето можно сделать и линейным.
Задание
Решите 5 первых задач из этого контеста:
https://informatics.msk.ru/mod/statements/view.php?id=34271
Линейное решето Эратосфена*
Наша цель — для каждого числа до (N) посчитать его минимальный простой делитель. Будем хранить его в массиве min_d. Параллельно будем хранить и список всех найденных простых чисел primes – это ровно те числа (x), у которых (min_d[x] = x).
Основное утверждение такое:
Пусть у числа (M) минимальный делитель равен (a). Тогда, если (M) составное, мы хотим вычеркнуть его ровно один раз при обработке числа (frac{M}{a}).
Мы также перебираем число (i) от (2) до (N). Если (min_d[i]) равно 0 (то есть мы не нашли ни один делитель у этого числа еще), значит оно простое – добавим в primes и сделаем (min_d[i] = i).
Далее мы хотим вычеркнуть все числа (i times k) такие, что (k) – это минимальный простой делитель этого числа. Из этого следует, что необходимо и достаточно перебрать (k) в массиве primes, и только до тех пор, пока (k < min_d[i]). Ну и перестать перебирать, если (i times k > N).
Алгоритм пометит все числа по одному разу, поэтому он корректен и работает за (O(N)).
N = 30
primes = []
min_d = [0] * (N + 1)
for i in range(2, N + 1):
if min_d[i] == 0:
min_d[i] = i
primes.append(i)
for p in primes:
if p > min_d[i] or i * p > N:
break
min_d[i * p] = p
print(i, min_d)
print(min_d)
print(primes)
2 [0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
3 [0, 0, 2, 3, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
4 [0, 0, 2, 3, 2, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5 [0, 0, 2, 3, 2, 5, 2, 0, 2, 3, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0]
6 [0, 0, 2, 3, 2, 5, 2, 0, 2, 3, 2, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0]
7 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0]
8 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 0, 0, 0, 3, 0, 0, 0, 5, 0, 0, 0, 0, 0]
9 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 0, 0, 3, 0, 0, 0, 5, 0, 3, 0, 0, 0]
10 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 0, 2, 3, 0, 0, 0, 5, 0, 3, 0, 0, 0]
11 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 0, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 0, 5, 0, 3, 0, 0, 0]
12 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 0, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 5, 0, 3, 0, 0, 0]
13 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 0, 0, 0]
14 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 0]
15 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
16 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 0, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
17 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
18 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 0, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
19 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
20 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
21 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
22 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 0, 2, 5, 2, 3, 2, 0, 2]
23 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
24 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
25 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
26 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
27 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
28 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 0, 2]
29 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 29, 2]
30 [0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 29, 2]
[0, 0, 2, 3, 2, 5, 2, 7, 2, 3, 2, 11, 2, 13, 2, 3, 2, 17, 2, 19, 2, 3, 2, 23, 2, 5, 2, 3, 2, 29, 2]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Этот алгоритм работает асимптотически быстрее, чем обычное решето. Но на практике, если писать обычное решето Эратсфена с оптимизациями, то оно оказывается быстрее линейнего. Также линейное решето занимает гораздо больше памяти – ведь в обычном решете можно хранить просто (N) бит, а здесь нам нужно (N) чисел и еще массив primes.
Зато один из «побочных эффектов» алгоритма — он неявно вычисляет факторизацию всех чисел от (1) до (N). Ведь зная минимальный простой делитель любого числа от (1) до (N) можно легко поделить на это число, посмотреть на новый минимальный простой делитель и так далее.
НОД и НОК
Введем два определения.
Наибольший общий делитель (НОД) чисел (a_1, a_2, ldots, a_n) — это максимальное такое число (x), что все (a_i) делятся на (x).
Наименьшее общее кратное (НОК) чисел (a_1, a_2, ldots, a_n) — это минимальное такое число (x), что (x) делится на все (a_i).
Например, * НОД(18, 30) = 6 * НОД(60, 180, 315) = 15 * НОД(1, N) = 1 * НОК(12, 30) = 6 * НОК(1, 2, 3, 4) = 12 * НОК(1, (N)) = (N)
Зачем они нужны? Например, они часто возникают в задачах.
Условие: Есть (N) шестеренок, каждая (i)-ая зацеплена с ((i-1))-ой. (i)-ая шестеренка имеет (a_i) зубчиков. Сколько раз нужно повернуть полносьтю первую шестеренку, чтобы все остальные шестеренки тоже вернулись на изначальное место?
Решение: Когда одна шестеренка крутится на 1 зубчик, все остальные тоже крутятся на один зубчик. Нужно найти минимальное такое число зубчиков (x), что при повороте на него все шестеренки вернутся в изначальное положение, то есть (x) делится на все (a_i), то есть это НОК((a_1, a_2, ldots, a_N)). Ответом будет (frac{x}{a_1}).
Еще пример задачи на применение НОД и НОК:
Условие: Город — это прямоугольник (n) на (m), разделенный на квадраты единичного размера. Вертолет летит из нижнего левого угла в верхний правый по прямой. Вертолет будит людей в квартале, когда он пролетает строго над его внутренностью (границы не считаются). Сколько кварталов разбудит вертолёт?
Решение: Вертолет пересечет по вертикали ((m-1)) границу. С этим ничего не поделать — каждое считается как новое посещение какого-то квартала. По горизонтали то же самое — ((n-1)) переход в новую ячейку будет сделан.
Однако еще есть случай, когда он пересекает одновременно обе границы (то есть пролетает над каким-нибудь углом) — ровно тот случай, когда нового посещения квартала не происходит. Сколько таких будет? Ровно столько, сколько есть целых решений уравнения (frac{n}{m} = frac{x}{y}). Мы как бы составили уравнение движения вертолёта и ищем, в скольки целых точках оно выполняется.
Пусть (t = НОД(n, m)), тогда (n = at, m = bt).
Тогда (frac{n}{m} = frac{a}{b} = frac{x}{y}). Любая дробь с натуральными числителем и знаменателем имеет ровно одно представление в виде несократимой дроби, так что (x) должно делиться на (a), а (y) должно делиться на (b). А значит, как ответ подходят ((a, b), (2a, 2b), (3a, 3b), cdots, ((t-1)a, (t-1)b)). Таких ответов ровно (t = НОД(n, m))
Значит, итоговый ответ: ((n-1) + (m-1) – (t-1)).
Кстати, когда (НОД(a, b) = 1), говорят, что (a) и (b) взаимно просты.
Алгоритм Евклида
Осталось придумать, как искать НОД и НОК. Понятно, что их можно искать перебором, но мы хотим хороший быстрый способ.
Давайте для начала научимся искать (НОД(a, b)).
Мы можем воспользоваться следующим равенством: [НОД(a, b) = НОД(a, b – a), b > a]
Оно доказывается очень просто: надо заметить, что множества общих делителей у пар ((a, b)) и ((a, b – a)) совпадают. Почему? Потому что если (a) и (b) делятся на (x), то и (b-a) делится на (x). И наоборот, если (a) и (b-a) делятся на (x), то и (b) делится на (x). Раз множства общих делитей совпадают, то и максимальный делитель совпадает.
Из этого равенства сразу следует следующее равенство: [НОД(a, b) = НОД(a, b operatorname{%} a), b > a]
(так как (НОД(a, b) = НОД(a, b – a) = НОД(a, b – 2a) = НОД(a, b – 3a) = ldots = НОД(a, b operatorname{%} a)))
Это равенство дает идею следующего рекурсивного алгоритма:
[НОД(a, b) = НОД(b operatorname{%} a, a) = НОД(a operatorname{%} , (b operatorname{%} a), b operatorname{%} a) = ldots]
Например: [НОД(93, 36) = ] [= НОД(36, 93spaceoperatorname{%}36) = НОД(36, 21) = ] [= НОД(21, 15) = ] [= НОД(15, 6) = ] [= НОД(6, 3) = ] [= НОД(3, 0) = 3]
Задание:
Примените алгоритм Евклида и найдите НОД чисел: * 1 и 500000 * 10, 20 * 18, 60 * 55, 34 * 100, 250
По-английски наибольший общий делитель — greatest common divisor. Поэтому вместо НОД будем в коде писать gcd.
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
print(gcd(1, 500000))
print(gcd(10, 20))
print(gcd(18, 60))
print(gcd(55, 34))
print(gcd(100, 250))
print(gcd(2465473782, 12542367456))
1
10
6
1
50
6
Вообще, в C++ такая функция уже есть в компиляторе g++
— называется __gcd
. Если у вас не Visual Studio, то, скорее всего, у вас g++
. Вообще, там много всего интересного.
А за сколько оно вообще работает?
Задание
Докажите, что алгоритм Евклида для чисел (N), (M) работает за (O(log(N+M))).
Кстати, интересный факт: самыми плохими входными данными для алгоритма Евклида являются числа Фибоначчи. Именно там и достигается логарифм.
Как выразить НОК через НОД
(НОК(a, b) = frac{ab}{НОД(a, b)})
По этой формуле можно легко найти НОК двух чисел через их произведение и НОД. Почему она верна?
Посмотрим на разложения на простые множители чисел a, b, НОК(a, b), НОД(a, b).
[ a = p_1^{a_1}times p_2^{a_2}timesldotstimes p_n^{a_n} ] [ b = p_1^{b_1}times p_2^{b_2}timesldotstimes p_n^{b_n} ] [ ab = p_1^{a_1+b_1}times p_2^{a_2+b_2}timesldotstimes p_n^{a_n+b_n} ]
Из определений НОД и НОК следует, что их факторизации выглядят так: [ НОД(a, b) = p_1^{min(a_1, b_1)}times p_2^{min(a_2, b_2)}timesldotstimes p_n^{min(a_n, b_n)} ] [ НОК(a, b) = p_1^{max(a_1, b_1)}times p_2^{max(a_2, b_2)}timesldotstimes p_n^{max(a_n, b_n)} ]
Тогда посчитаем (НОД(a, b) times НОК(a, b)): [ НОД(a, b)НОК(a, b) = p_1^{min(a_1, b_1)+max(a_1, b_1)}times p_2^{min(a_2, b_2)+max(a_2, b_2)}timesldotstimes p_n^{min(a_n, b_n)+max(a_n, b_n)} =] [ = p_1^{a_1+b_1}times p_2^{a_2+b_2}timesldotstimes p_n^{a_n+b_n} = ab]
Формула доказана.
Как посчитать НОД/НОК от более чем 2 чисел
Для того, чтобы искать НОД или НОК у более чем двух чисел, достаточно считать их по цепочке:
(НОД(a, b, c, d, ldots) = НОД(НОД(a, b), c, d, ldots))
(НОК(a, b, c, d, ldots) = НОК(НОК(a, b), c, d, ldots))
Почему это верно?
Ну просто множество общих делителей (a) и (b) совпадает с множеством делителей (НОД(a, b)). Из этого следует, что и множество общих делителей (a), (b) и еще каких-то чисел совпадает с множеством общих делителей (НОД(a, b)) и этих же чисел. И раз совпадают множества общих делителей, то и наибольший из них совпадает.
С НОК то же самое, только фразу “множество общих делителей” надо заменить на “множество общих кратных”.
Задание
Решите задачи F, G, H, I из этого контеста:
https://informatics.msk.ru/mod/statements/view.php?id=34271
Расширенный алгоритм Евклида*
Очень важным для математики свойством наибольшего общего делителя является следующий факт:
Для любых целых (a, b) найдутся такие целые (x, y), что (ax + by = d), где (d = gcd(a, b)).
Из этого следует, что существует решение в целых числах, например, у таких уравнений: * (8x + 6y = 2) * (4x – 5y = 1) * (116x + 44y = 4) * (3x + 11y = -1)
Мы сейчас не только докажем, что решения у таких уравнений существуют, но и приведем быстрый алгоритм нахождения этих решений. Здесь нам вновь пригодится алгоритм Евклида.
Рассмотрим один шаг алгоритма Евклида, преобразующий пару ((a, b)) в пару ((b, a operatorname{%} b)). Обозначим (r = a operatorname{%} b), то есть запишем деление с остатком в виде (a = bq + r).
Предположим, что у нас есть решение данного уравнения для чисел (b) и (r) (их наибольший общий делитель, как известно, тоже равен (d)): [bx_0 + ry_0 = d]
Теперь сделаем в этом выражении замену (r = a – bq):
[bx_0 + ry_0 = bx_0 + (a – bq)y_0 = ay_0 + b(x_0 – qy_0)]
Tаким образом, можно взять (x = y_0), а (y = (x_0 – qy_0) = (x_0 – (a operatorname{/} b)y_0)) (здесь (/) обозначает целочисленное деление).
В конце алгоритма Евклида мы всегда получаем пару ((d, 0)). Для нее решение требуемого уравнения легко подбирается — (d * 1 + 0 * 0 = d). Теперь, используя вышесказанное, мы можем идти обратно, при вычислении заменяя пару ((x, y)) (решение для чисел (b) и (a operatorname{%} b)) на пару ((y, x – (a / b)y)) (решение для чисел (a) и (b)).
Это удобно реализовывать рекурсивно:
def extended_gcd(a, b):
if b == 0:
return a, 1, 0
d, x, y = extended_gcd(b, a % b)
return d, y, x - (a // b) * y
a, b = 3, 5
res = extended_gcd(a, b)
print("{3} * {1} + {4} * {2} = {0}".format(res[0], res[1], res[2], a, b))
3 * 2 + 5 * -1 = 1
Но также полезно и посмотреть, как будет работать расширенный алгоритм Евклида и на каком-нибудь конкретном примере. Пусть мы, например, хотим найти целочисленное решение такого уравнения: [116x + 44y = 4] [(2times44+28)x + 44y = 4] [44(2x+y) + 28x = 4] [44x_0 + 28y_0 = 4] Следовательно, [x = y_0, y = x_0 – 2y_0] Будем повторять такой шаг несколько раз, получим такие уравнения: [116x + 44y = 4] [44x_0 + 28y_0 = 4, x = y_0, y = x_0 – 2y_0] [28x_1 + 16y_1 = 4, x_0 = y_1, y_0 = x_1 – y_1] [16x_2 + 12y_2 = 4, x_1 = y_2, y_1 = x_2 – y_2] [12x_3 + 4y_3 = 4, x_2 = y_3, y_2 = x_3 – y_3] [4x_4 + 0y_4 = 4, x_3 = y_4, y_3 = x_4 – 3 y_4] А теперь свернем обратно: [x_4 = 1, y_4 = 0] [x_3 = 0, y_3 =1] [x_2 = 1, y_2 =-1] [x_1 = -1, y_1 =2] [x_0 = 2, y_0 =-3] [x = -3, y =8]
Действительно, (116times(-3) + 44times8 = 4)
Задание
Решите задачу J из этого контеста:
https://informatics.msk.ru/mod/statements/view.php?id=34273
Операции по модулю
Выражение (a equiv b pmod m) означает, что остатки от деления (a) на (m) и (b) на (m) равны. Это выражение читается как «(a) сравнимо (b) по модулю (m)».
Еще это можно опрделить так: (a) сравнимо c (b) по модулю (m), если ((a – b)) делится на (m).
Все целые числа можно разделить на классы эквивалентности — два числа лежат в одном классе, если они сравнимы по модулю (m). Говорят, что мы работаем в «кольце остатков по модулю (m)», и в нем ровно (m) элементов: (0, 1, 2, cdots, m-1).
Сложение, вычитение и умножение по модулю определяются довольно интуитивно — нужно выполнить соответствующую операцию и взять остаток от деления.
С делением намного сложнее — поделить и взять по модулю не работает. Об этом подробнее поговорим чуть дальше.
a = 30
b = 50
mod = 71
print('{} + {} = {} (mod {})'.format(a, b, (a + b) % mod, mod))
print('{} - {} = {} (mod {})'.format(a, b, (a - b) % mod, mod)) # на C++ это может не работать, так как модуль от отрицательного числа берется странно
print('{} - {} = {} (mod {})'.format(a, b, (a - b + mod) % mod, mod)) # на C++ надо писать так, чтобы брать модулю от гарантированно неотрицательного числа
print('{} * {} = {} (mod {})'.format(a, b, (a * b) % mod, mod))
# print((a / b) % mod) # а как писать это, пока неясно
30 + 50 = 9 (mod 71)
30 - 50 = 51 (mod 71)
30 - 50 = 51 (mod 71)
30 * 50 = 9 (mod 71)
Задание
Посчитайте: * (2 + 3 pmod 5) * (2 * 3 pmod 5) * (2 ^ 3 pmod 5) * (2 – 4 pmod 5) * (5 + 5 pmod 6) * (2 * 3 pmod 6) * (3 * 3 pmod 6)
Для умножения (в C++) нужно ещё учитывать следующий факт: при переполнении типа всё ломается (разве что если вы используете в качестве модуля степень двойки).
int
вмещает до (2^{31} – 1 approx 2 cdot 10^9).long long
вмещает до (2^{63} – 1 approx 8 cdot 10^{18}).long long long
в плюсах нет, при попытке заиспользовать выдает ошибкуlong long long is too long
.- Под некоторыми компиляторами и архитектурами доступен
int128
, но не везде и не все функции его поддерживают (например, его нельзя вывести обычными методами).
Зачем нужно считать ответ по модулю
Очень часто в задаче нужно научиться считать число, которое в худшем случае гораздо больше, чем (10^{18}). Тогда, чтобы не заставлять вас писать длинную арифметику, автор задачи часто просит найти ответ по модулю большого числа, обычно (10^9 + 7)
Кстати, вместо того, чтобы писать (1000000007) удобно просто написать (1e9 + 7). (1e9) означает (1 times 10^9)
int mod = 1e9 + 7; # В C++
cout << mod;
1000000007
N = 1e9 + 7 # В питоне такое число становится float
print(N)
print(int(N))
1000000007.0
1000000007
Быстрое возведение в степень
Задача: > Даны натуральные числа (a, b, c < 10^9). Найдите (a^b) (mod (c)).
Мы хотим научиться возводить число в большую степень быстро, не просто умножая (a) на себя (b) раз. Требование на модуль здесь дано только для того, чтобы иметь возможность проверить правильность алгоритма для чисел, которые не влезают в int и long long.
Сам алгоритм довольно простой и рекурсивный, постарайтесь его придумать, решая вот такие примеры (прямо решать необязательно, но можно придумать, как посчитать значение этих чисел очень быстро):
- (3^2)
- (3^4)
- (3^8)
- (3^{16})
- (3^{32})
- (3^{33})
- (3^{66})
- (3^{132})
- (3^{133})
- (3^{266})
- (3^{532})
- (3^{533})
- (3^{1066})
Да, здесь специально приведена такая последовательность, в которой каждое следующее число легко считается через предыдущее: его либо нужно умножить на (a=3), либо возвести в квадрат. Так и получается рекурсивный алгоритм:
- (a^0 = 1)
- (a^{2k}=(a^{k})^2)
- (a^{2k+1}=a^{2k}times a)
Нужно только после каждой операции делать mod: * (a^0 pmod c = 1) * (a^{2k} pmod c = (a^{k} pmod c)^2 pmod c) * (a^{2k+1} pmod c = ((a^{2k}pmod c) times a) pmod c)
Этот алгоритм называется быстрое возведение в степень. Он имеет много применений: * в криптографии очень часто надо возводить число в большую степень по модулю * используется для деления по простому модулю (см. далее) * можно быстро перемножать не только числа, но еще и матрицы (используется для динамики, например)
Асимптотика этого алгоритма, очевидно, (O(log c)) – за каждые две итерации число уменьшается хотя бы в 2 раза.
Задание
Решите задачу K из этого контеста:
https://informatics.msk.ru/mod/statements/view.php?id=34271
Задание
Решите как можно больше задач из практического контеста:
https://informatics.msk.ru/mod/statements/view.php?id=34273
Деление по модулю*
Давайте все-таки научимся не только умножать, но и делить по простому модулю. Вот только что это значит?
(a / b) = (a times b^{-1}), где (b^{-1}) – это обратный элемент к (b).
Определение: (b^{-1}) – это такое число, что (bb^{-1} = 1)
Утверждение: в кольце остатков по простому модулю (p) у каждого остатка (кроме 0) существует ровно один обратный элемент.
Например, обратный к (2) по модулю (5) это (3) ((2 times 3 = 1 pmod 5)))
Задание
Найдите обратный элемент к: * числу (3) по модулю (5) * числу (3) по модулю (7) * числу (1) по модулю (7) * числу (2) по модулю (3) * числу (9) по модулю (31)
Давайте докажем это утверждение: надо заметить, что если каждый ненулевой остаток (1, 2, ldots, (p-1)) умножить на ненулевой остаток (a), то получатся числа (a, 2a, ldots, (p-1)a) – и они все разные! Они разные, потому что если (xa = ya), то ((x-y)a = 0), а значит ((x – y) a) делится на (p), (a) – ненулевой остаток, а значит (x = y), и это не разные числа. И из того, что все числа получились разными, это все ненулевые, и их столько же, следует, что это ровно тот же набор чисел, просто в другом порядке!
Из этого следует, что среди этих чисел есть (1), причем ровно один раз. А значит существует ровно один обратный элемент (a^{-1}). Доказательство закончено.
Это здорово, но этот обратный элемент еще хочется быстро находить. Быстрее, чем за (O(p)).
Есть несколько способов это сделать.
Через малую теорему Ферма
Малая теорема Ферма: > (a^{p-1} = 1 pmod p), если (p) – простое, (a neq 0 pmod p)).
Доказательство: В предыдущем пункте мы выяснили, что множества чисел (1, 2, ldots, (p-1)) и (a, 2a, ldots, (p-1)a) совпадают. Из этого следует, что их произведения тоже совпадают по модулю: ((p-1)! = a^{p-1} (p-1)! pmod p).
((p-1)!neq 0 pmod p) а значит на него можно поделить (это мы кстати только в предыдущем пункте доказали, поделить на число – значит умножить на обратный к нему, который существует).
А значит, (a^{p – 1} = 1 pmod p).
Как это применить Осталось заметить, что из малой теоремы Ферма сразу следует, что (a^{p-2}) – это обратный элемент к (a), а значит мы свели задачу к возведению (a) в степень (p-2), что благодаря быстрому возведению в степень мы умеем делать за (O(log p)).
Обобщение У малой теоремы Ферма есть обобщение для составных (p):
Теорема Эйлера: > (a^{varphi(p)} = 1 pmod p), (a) – взаимно просто с (p), а (varphi(p)) – это функция Эйлера (количество чисел, меньших (p) и взаимно простых с (p)).
Доказывается теорема очень похоже, только вместо ненулевых остатков (1, 2, ldots, p-1) нужно брать остатки, взаимно простые с (p). Их как раз не (p-1), а (varphi(p)).
Для нахождения обратного по этой теореме достаточно посчитать функцию Эйлера (varphi(p)) и найти (a^{-1} = a^{varphi(p) – 1}).
Но с этим возникают большие проблемы: посчитать функцию Эйлера сложно. Более того, на предполагаемой невозможности быстро ее посчитать построены некоторые криптографические алгоритм типа RSA. Поэтому быстро делить по составному модулю этим способом не получится.
Через расширенный алгоритм Евклида
Этим способом легко получится делить по любому модулю! Рекомендую.
Пусть мы хотим найти (a^{-1} pmod p), (a) и (p) взаимно простые (а иначе обратного и не будет существовать).
Давайте найдем корни уравнения
[ax + py = 1]
Они есть и находятся расширенным алгоритмом Евклида за (O(log p)), так как (НОД(a, p) = 1), ведь они взаимно простые.
Тогда если взять остаток по модулю (p):
[ax = 1 pmod p]
А значит, найденный (x) и будет обратным элементом к (a).
То есть надо просто найти (x) из решения того уравнения по модулю (p). Можно брать по модулю прямо походу решения уравнения, чтобы случайно не переполниться.
Факториал — Википедия. Что такое Факториал
Факториа́л — функция, определённая на множестве неотрицательных целых чисел. Название происходит от лат. factorialis — действующий, производящий, умножающий; обозначается n!, произносится эн факториа́л. Факториал натурального числа n определяется как произведение всех натуральных чисел от 1 до n включительно:
- n!=1⋅2⋅…⋅n=∏k=1nk{displaystyle n!=1cdot 2cdot ldots cdot n=prod _{k=1}^{n}k}.
Например,
- 5!=1⋅2⋅3⋅4⋅5=120{displaystyle 5!=1cdot 2cdot 3cdot 4cdot 5=120}.
Из определения факториала следует соотношение (n−1)!=n!n{displaystyle (n-1)!={frac {n!}{n}}}, откуда при n=1{displaystyle n=1} формально находим
- 0!=1{displaystyle 0!=1}.
Последнее равенство обычно принимают в качестве соглашения, хотя, как показано выше, оно следует из определения факториала для натуральных чисел при условии, что все значения функции связаны единым рекуррентным соотношением.
n | n! |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 6 |
4 | 24 |
5 | 120 |
6 | 720 |
7 | 5040 |
8 | 40320 |
9 | 362880 |
10 | 3628800 |
11 | 39916800 |
12 | 479001600 |
13 | 6227020800 |
14 | 87178291200 |
15 | 1307674368000 |
16 | 20922789888000 |
17 | 355687428096000 |
18 | 6402373705728000 |
19 | 121645100408832000 |
20 | 2432902008176640000 |
25 | ≈1,551121004 × 1025 |
50 | ≈3,041409320 × 1064 |
70 | ≈1,197857167 × 10100 |
100 | ≈9,332621544 × 10157 |
450 | ≈1,733368733 × 101000 |
1000 | ≈4,023872601 × 102567 |
3249 | ≈6,412337688 × 1010000 |
10000 | ≈2,846259681 × 1035659 |
25206 | ≈1,205703438 × 10100000 |
100000 | ≈2,824229408 × 10456573 |
205023 | ≈2,503898932 × 101000004 |
1000000 | ≈8,263931688 × 105565708 |
10100 | ≈109,956570552 × 10101 |
101000 | ≈10101003 |
1010 000 | ≈101010 004 |
10100 000 | ≈1010100 005 |
1010100 | ≈101010100 |
Факториал активно используется в различных разделах математики: комбинаторике, математическом анализе, теории чисел, функциональном анализе и др.
Факториал является чрезвычайно быстро растущей функцией. Он растёт быстрее, чем любая показательная функция или любая степенная функция, а также быстрее, чем любая сумма произведений этих функций. Однако, степенно-показательная функция nn{displaystyle n^{n}} растёт быстрее факториала, так же как и большинство двойных степенных, например een{displaystyle e^{e^{n}}}.
Свойства
Рекуррентная формула
- n!={1n=0,n⋅(n−1)!n>0.{displaystyle n!={begin{cases}1&n=0,\ncdot (n-1)!&n>0.end{cases}}}
Комбинаторная интерпретация
В комбинаторике факториал натурального числа n интерпретируется как количество перестановок (упорядочиваний) множества из n элементов. Например, для множества {A,B,C,D} из 4-х элементов существует 4! = 24 перестановки:
ABCD BACD CABD DABC ABDC BADC CADB DACB ACBD BCAD CBAD DBAC ACDB BCDA CBDA DBCA ADBC BDAC CDAB DCAB ADCB BDCA CDBA DCBA
Комбинаторная интерпретация факториала подтверждает целесообразность соглашения 0!=1{displaystyle 0!=1}. Так, формула для числа размещений из n{displaystyle n} элементов по m{displaystyle m}
- Anm=n!(n−m)!{displaystyle A_{n}^{m}={frac {n!}{(n-m)!}}}
при n=m{displaystyle n=m} обращается в формулу для числа перестановок из n{displaystyle n} элементов (порядка n{displaystyle n}), которое равно n!{displaystyle n!}.
Связь с гамма-функцией
Пи-функция, определённая для всех вещественных чисел, кроме отрицательных целых, и совпадающая при натуральных значениях аргумента с факториалом.
Факториал связан с гамма-функцией от целочисленного аргумента соотношением
- n!=Γ(n+1){displaystyle n!=Gamma (n+1)}.
Это же выражение используют для обобщения понятия факториала на множество вещественных чисел. Используя аналитическое продолжение гамма-функции, область определения факториала также расширяют на всю комплексную плоскость, исключая особые точки при n=−1,−2,−3…{displaystyle n=-1,-2,-3ldots }.
Непосредственным обобщением факториала на множества вещественных и комплексных чисел служит пи-функция Π(z)=Γ(z+1){displaystyle Pi (z)=Gamma (z+1)}, которая при Re(z)>−1{displaystyle mathrm {Re} (z)>-1} может быть определена как
- Π(z)=∫0∞tze−tdt{displaystyle Pi (z)=int _{0}^{infty }t^{z}e^{-t},mathrm {d} t} (интегральное определение).
Пи-функция натурального числа или нуля совпадает с его факториалом: Π(n)=n!{displaystyle Pi (n)=n!}. Как и факториал, пи-функция удовлетворяет рекуррентному соотношению Π(z)=zΠ(z−1){displaystyle Pi (z)=zPi (z-1)}.
Формула Стирлинга
Формула Стирлинга — асимптотическая формула для вычисления факториала:
- n!=2πn(ne)n(1+112n+1288n2−13951840n3−5712488320n4+163879209018880n5+524681975246796800n6+O(n−7)),{displaystyle n!={sqrt {2pi n}}left({frac {n}{e}}right)^{n}left(1+{frac {1}{12n}}+{frac {1}{288n^{2}}}-{frac {139}{51840n^{3}}}-{frac {571}{2488320n^{4}}}+{frac {163879}{209018880n^{5}}}+{frac {5246819}{75246796800n^{6}}}+Oleft(n^{-7}right)right),}
см. O-большое[1].
Во многих случаях для приближённого значения факториала достаточно рассматривать только главный член формулы Стирлинга:
- n!≈2πn(ne)n.{displaystyle n!approx {sqrt {2pi n}}left({frac {n}{e}}right)^{n}.}
При этом можно утверждать, что
- 2πn(ne)ne1/(12n+1)<n!<2πn(ne)ne1/(12n).{displaystyle {sqrt {2pi n}}left({frac {n}{e}}right)^{n}e^{1/(12n+1)}<n!<{sqrt {2pi n}}left({frac {n}{e}}right)^{n}e^{1/(12n)}.}
Формула Стирлинга позволяет получить приближённые значения факториалов больших чисел без непосредственного перемножения последовательности натуральных чисел. Например, с помощью формулы Стирлинга легко подсчитать, что
- 100! ≈ 9,33×10157;
- 1000! ≈ 4,02×102567;
- 10 000! ≈ 2,85×1035 659.
Разложение на простые числа
Каждое простое число p входит в разложение n! на простые множители в степени
- ⌊np⌋+⌊np2⌋+⌊np3⌋+….{displaystyle leftlfloor {frac {n}{p}}rightrfloor +leftlfloor {frac {n}{p^{2}}}rightrfloor +leftlfloor {frac {n}{p^{3}}}rightrfloor +ldots .}
Таким образом,
- n!=∏pp⌊np⌋+⌊np2⌋+…,{displaystyle n!=prod _{p}p^{lfloor {frac {n}{p}}rfloor +lfloor {frac {n}{p^{2}}}rfloor +ldots },}
где произведение берётся по всем простым числам. Можно заметить, что для всякого простого p большего n соответствующий множитель в произведении равен 1, следовательно произведение можно брать лишь по простым p, не превосходящим n.
Связь с производной от степенной функции
Для целого неотрицательного числа n:
- (xn)(n)=n!{displaystyle left(x^{n}right)^{(n)}=n!}
Например:
- (x5)(5)=(5⋅x4)(4)=(5⋅4⋅x3)‴=(5⋅4⋅3⋅x2)″=(5⋅4⋅3⋅2⋅x)′=5⋅4⋅3⋅2⋅1=5!{displaystyle left(x^{5}right)^{(5)}=left(5cdot x^{4}right)^{(4)}=left(5cdot 4cdot x^{3}right)»’=left(5cdot 4cdot 3cdot x^{2}right)»=left(5cdot 4cdot 3cdot 2cdot xright)’={5cdot 4cdot 3cdot 2cdot 1}=5!}
Другие свойства
- Для натурального числа n:
- n!2⩾nn⩾n!⩾n{displaystyle n!^{2}geqslant n^{n}geqslant n!geqslant n}
- Для любого n>1:
- n!{displaystyle n!} не является квадратом целого числа.
Факториал дробного числа
Для дробного числа, факториал может определяться по формуле:
n!=[n]!⋅([n]+1){n}{displaystyle n!=[n]!cdot ([n]+1)^{left{nright}}}
где, [n]{displaystyle [n]}- целая часть от изначального числа ([4,5] = 4), a {n}{displaystyle {n}}- дробная часть ({4,5} = 0,5).
История
Факториальные выражения появились ещё в ранних исследованиях по комбинаторике, хотя компактное обозначение n!{displaystyle n!} предложил французский математик Кристиан Крамп только в 1808 году[2]. Важным этапом стало открытие формулы Стирлинга, которую Джеймс Стирлинг опубликовал в своём трактате «Дифференциальный метод» (лат. Methodus differentialis, 1730 год). Немного ранее почти такую же формулу опубликовал друг Стирлинга Абрахам де Муавр, но в менее завершённом виде (вместо коэффициента 2π{displaystyle {sqrt {2pi }}} была неопределённая константа)[3].
Стирлинг подробно исследовал свойства факториала, вплоть до выяснения вопроса о том, нельзя ли распространить это понятие на произвольные вещественные числа. Он описал несколько возможных путей к реализации этой идеи и высказал мнение, что:
- (12)!=π2{displaystyle left({1 over 2}right)!={frac {sqrt {pi }}{2}}}
Стирлинг не знал, что годом ранее решение проблемы уже нашёл Леонард Эйлер. В письме к Кристиану Гольдбаху Эйлер описал требуемое обобщение[4]:
- x!=limm→∞mxm!(x+1)(x+2)…(x+m){displaystyle x!=lim _{mto infty }{frac {m^{x}m!}{(x+1)(x+2)dots (x+m)}}}
Развивая эту идею, Эйлер в следующем, 1730 году ввёл понятие гамма-функции в виде классического интеграла. Эти результаты он опубликовал в журнале Санкт-Петербургской Академии наук в 1729—1730 годах.
Обобщения
Двойной факториал
Двойной факториал числа n обозначается n‼ и определяется как произведение всех натуральных чисел в отрезке [1,n], имеющих ту же чётность, что и n.
- n!!=2⋅4⋅6⋅…⋅n=∏i=1n22i=21n2⋅(n2)!{displaystyle n!!=2cdot 4cdot 6cdot ldots cdot n=prod _{i=1}^{frac {n}{2}}2i=2^{{color {white}1}^{!!!!{frac {n}{2}}}}cdot left({frac {n}{2}}right)!}
- Для нечётного n:
- n!!=1⋅3⋅5⋅…⋅n=∏i=0n−12(2i+1)=n!21n−12⋅(n−12)!{displaystyle n!!={1cdot 3cdot 5cdot ldots cdot n}=prod _{i=0}^{frac {n-1}{2}}(2i+1)={frac {n!}{2^{{color {white}1}^{!!!!{frac {n-1}{2}}}}cdot left({frac {n-1}{2}}right)!}}}
Связь между двойными факториалами двух соседних целых неотрицательных чисел и обычным факториалом одного из них.
- n!!=(n+1)!(n+1)!!{displaystyle n!!={frac {(n+1)!}{(n+1)!!}}}
- Для нечётного n:
- n!!=n!(n−1)!!{displaystyle n!!={frac {n!}{(n-1)!!}}}
Выведение формул
Осуществив замену n=2k{displaystyle n=2k} для чётного n и n=2k+1{displaystyle n=2k+1} для нечётного n соответственно, где k{displaystyle k} — целое неотрицательное число, получим:
- для чётного числа:
- (2k)!!=2⋅4⋅6⋅…⋅2k=∏i=1k2i=2k⋅k!{displaystyle (2k)!!=2cdot 4cdot 6cdot ldots cdot 2k=prod _{i=1}^{k}2i=2^{k}cdot k!}
- для нечётного числа:
- (2k+1)!!=1⋅3⋅5⋅…⋅(2k+1)=∏i=0k(2i+1)=(2k+1)!2k⋅k!{displaystyle (2k+1)!!=1cdot 3cdot 5cdot ldots cdot (2k+1)=prod _{i=0}^{k}(2i+1)={frac {(2k+1)!}{2^{k}cdot k!}}}
По договорённости: 0!!=1{displaystyle 0!!=1}. Также это равенство выполняется естественным образом:
- 0!!=20⋅0!=1⋅1=1{displaystyle 0!!=2^{0}cdot 0!=1cdot 1=1}
Двойной факториал, также как и обычный факториал, определён только для целых неотрицательных чисел.
Последовательность значений n!! начинается так[5]:
- 1, 1, 2, 3, 8, 15, 48, 105, 384, 945, 3840, 10 395, 46 080, 135 135, 645 120, 2 027 025, 10 321 920, 34 459 425, 185 794 560, 654 729 075, 3 715 891 200, 13 749 310 575, 81 749 606 400, 316 234 143 225, 1 961 990 553 600, 7 905 853 580 625, 51 011 754 393 600, …
Кратный факториал
m-кратный факториал числа n обозначается n!!…!⏟m{displaystyle textstyle nunderbrace {!!ldots !} _{m}} и определяется следующим образом. Пусть число n представимо в виде n=mk−r,{displaystyle n=mk-r,} где k∈Z,{displaystyle kin mathbb {Z} ,} r∈{0,1,…,m−1}.{displaystyle rin {0,1,ldots ,m-1}.} Тогда[6]
- n!!…!⏟m=∏i=1k(mi−r){displaystyle nunderbrace {!!ldots !} _{m}=prod _{i=1}^{k}(mi-r)}
Обычный и двойной факториалы являются частными случаями m-кратного факториала для m = 1 и m = 2 соответственно.
Кратный факториал связан с гамма-функцией следующим соотношением[7]:
- n!!…!⏟m=∏i=1k(mi−r)=mk⋅Γ(k−rm+1)Γ(1−rm).{displaystyle nunderbrace {!!ldots !} _{m}=prod _{i=1}^{k}(mi-r)=m^{k}cdot {frac {Gamma left(k-{frac {r}{m}}+1right)}{Gamma left(1-{frac {r}{m}}right)}}.}
Неполный факториал
Убывающий факториал
Убывающим факториалом называется выражение
- (n)k=nk_=n[k]=n⋅(n−1)⋅…⋅(n−k+1)=n!(n−k)!=∏i=n−k+1ni{displaystyle (n)_{k}=n^{underline {k}}=n^{[k]}=ncdot (n-1)cdot ldots cdot (n-k+1)={frac {n!}{(n-k)!}}=prod _{i=n-k+1}^{n}i}.
Например:
- n = 7; k = 4,
- (n − k) + 1 = 4,
- nk = 7 • 6 • 5 • 4 = 840.
Убывающий факториал даёт число размещений из n по k.
Возрастающий факториал
Возрастающим факториалом называется выражение
- n(k)=nk¯=n⋅(n+1)⋅…⋅(n+k−1)=(n+k−1)!(n−1)!=∏i=n(n+k)−1i.{displaystyle n^{(k)}=n^{overline {k}}=ncdot (n+1)cdot ldots cdot (n+k-1)={frac {(n+k-1)!}{(n-1)!}}=prod _{i=n}^{(n+k)-1}i.}
Праймориал или примориал
Праймориал или примориал (англ. primorial) числа n обозначается pn# и определяется как произведение n первых простых чисел. Например,
- p5#=2×3×5×7×11=2310{displaystyle p_{5}#=2times 3times 5times 7times 11=2310}.
Иногда праймориалом называют число n#{displaystyle n#}, определяемое как произведение всех простых чисел, не превышающих заданное n.
Последовательность праймориалов (включая 1#≡1{displaystyle {textstyle {1#equiv 1}}}) начинается так[8]:
- 1, 2, 6, 30, 210, 2310, 30 030, 510 510, 9 699 690, 223 092 870, 6 469 693 230, 200 560 490 130, 7 420 738 134 810, 304 250 263 527 210, 13 082 761 331 670 030, 614 889 782 588 491 410, 32 589 158 477 190 044 730, 1 922 760 350 154 212 639 070, …
Суперфакториалы
Нейл Слоан и Симон Плуффэ (англ.) в 1995 году определили суперфакториал как произведение первых n факториалов. Согласно этому определению, суперфакториал четырёх равен
- sf(4)=1!×2!×3!×4!=288{displaystyle operatorname {sf} (4)=1!times 2!times 3!times 4!=288}
(поскольку устоявшегося обозначения нет, используется функциональное).
В общем
- sf(n)=∏k=1nk!=∏k=1nkn−k+1=1n⋅2n−1⋅3n−2⋯(n−1)2⋅n1.{displaystyle operatorname {sf} (n)=prod _{k=1}^{n}k!=prod _{k=1}^{n}k^{n-k+1}=1^{n}cdot 2^{n-1}cdot 3^{n-2}cdots (n-1)^{2}cdot n^{1}.}
Последовательность суперфакториалов чисел n⩾0{displaystyle ngeqslant 0} начинается так[9]:
- 1, 1, 2, 12, 288, 34 560, 24 883 200, 125 411 328 000, 5 056 584 744 960 000, 1 834 933 472 251 084 800 000, 6 658 606 584 104 736 522 240 000 000, 265 790 267 296 391 946 810 949 632 000 000 000, 127 313 963 299 399 416 749 559 771 247 411 200 000 000 000, …
Идея была обобщена в 2000 году Генри Боттомли (англ.), что привело к гиперфакториалам (англ. Hyperfactorial), которые являются произведением первых n суперфакториалов. Последовательность гиперфакториалов чисел n⩾0{displaystyle ngeqslant 0} начинается так[10]:
- 1, 1, 2, 24, 6912, 238 878 720, 5 944 066 965 504 000, 745 453 331 864 786 829 312 000 000, 3 769 447 945 987 085 350 501 386 572 267 520 000 000 000, 6 916 686 207 999 802 072 984 424 331 678 589 933 649 915 805 696 000 000 000 000 000, …
Продолжая рекуррентно, можно определить факториал кратного уровня, или m-уровневый факториал числа n, как произведение (m − 1)-уровневых факториалов чисел от 1 до n, то есть
- mf(n,m)=mf(n−1,m)mf(n,m−1)=∏k=1nk(n−k+m−1n−k),{displaystyle operatorname {mf} (n,m)=operatorname {mf} (n-1,m)operatorname {mf} (n,m-1)=prod _{k=1}^{n}k^{n-k+m-1 choose n-k},}
где mf(n,0)=n{displaystyle operatorname {mf} (n,0)=n} для n>0{displaystyle n>0} и mf(0,m)=1.{displaystyle operatorname {mf} (0,m)=1.}
Субфакториал
Субфакториал !n определяется как количество беспорядков порядка n, то есть перестановок n-элементного множества без неподвижных точек.
См. также
Примечания
wiki.sc
Факториал — Википедия (с комментариями)
Материал из Википедии — свободной энциклопедии
Факториа́л числа n (лат. factorialis — действующий, производящий, умножающий; обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел от 1 до n включительно:
- <math>n! = 1cdot 2cdotldotscdot n =prod_{i=1}^n i.</math>
Например:
- <math>5 ! = 1 cdot 2 cdot 3 cdot 4 cdot 5 = 120</math>.
По договорённости: <math>0! = 1</math>. Также это равенство выполняется естественным образом:
- <math>0! = Bigl.(n-1)!Bigr|_{n=1} = Bigl.frac{n!}{n}Bigr|_{n=1} = frac{1!}{1} = 1</math>
Факториал определён только для целых неотрицательных чисел.
Последовательность факториалов неотрицательных целых чисел начинается так[1]:
- 1, 1, 2, 6, 24, 120, 720, 5040, 40 320, 362 880, 3 628 800, 39 916 800, 479 001 600, 6 227 020 800, 87 178 291 200, 1 307 674 368 000, 20 922 789 888 000, 355 687 428 096 000, 6 402 373 705 728 000, 121 645 100 408 832 000, 2 432 902 008 176 640 000, …
Факториалы часто используются в комбинаторике, теории чисел и функциональном анализе. Обозначение факториала в формате <math>n!</math> предложил французский математик Кристиан Крамп в 1808 году[2].
Факториал является чрезвычайно быстро растущей функцией. Он растёт быстрее, чем многочлен любой степени, и быстрее, чем экспоненциальная функция (но медленнее, чем двойная экспоненциальная функция <math>e^{e^n}</math>).
Свойства
Рекуррентная формула
- <math>n!= begin{cases}
1 & n = 0,\
n cdot (n-1)! & n > 0.
end{cases}</math>
Комбинаторная интерпретация
В комбинаторике факториал натурального числа n интерпретируется как количество перестановок (упорядочиваний) множества из n элементов. Например, для множества {A,B,C,D} из 4-х элементов существует 4! = 24 перестановки:
ABCD BACD CABD DABC ABDC BADC CADB DACB ACBD BCAD CBAD DBAC ACDB BCDA CBDA DBCA ADBC BDAC CDAB DCAB ADCB BDCA CDBA DCBA
Комбинаторная интерпретация факториала служит обоснованием тождества 0! = 1, так как пустое множество упорядочено единственным способом.
Связь с гамма-функцией
Факториал связан с гамма-функцией от целочисленного аргумента соотношением:
- <math>n! = Gamma(n+1).</math>
Таким образом, гамма-функцию рассматривают как обобщение факториала для положительных вещественных чисел.
Путём аналитического продолжения её также расширяют и на всю комплексную плоскость, исключая особые точки при <math>n=-1, -2, -3ldots</math>.
Более непосредственным обобщением факториала на множество вещественных (и комплексных) чисел является пи-функция, определяемая как
- <math>Pi(z)=int_0^infty t^{z} e^{-t}, mathrm{d}t</math>.
Поскольку <math>Pi(z) = Gamma(z+1) ,,</math> то пи-функция натурального числа совпадает с его факториалом: <math>Pi(n) = n!.</math> Как факториал, пи-функция удовлетворяет рекурсивному соотношению <math>Pi(z) = zPi(z-1),.</math>
Формула Стирлинга
Формула Стирлинга — асимптотическая формула для вычисления факториала:
- <math>n! = sqrt{2pi n}left(frac{n}{e}right)^n left(1 + frac{1}{12 n} + frac{1}{288 n^2} — frac{139}{51840 n^3} — frac{571}{2488320 n^4} + frac{163879}{209018880 n^5} + frac{5246819}{75246796800 n^6} + Oleft(n^{-7}right)right),</math>
см. O-большое[3].
Во многих случаях для приближённого значения факториала достаточно рассматривать только главный член формулы Стирлинга:
- <math>n! approx sqrt{2pi n}left(frac{n}{e}right)^n.</math>
При этом можно утверждать, что
- <math>sqrt{2pi n}left(frac{n}{e}right)^n e^{1/(12n+1)}< n! < sqrt{2pi n}left(frac{n}{e}right)^n e^{1/(12n)}.</math>
Формула Стирлинга позволяет получить приближённые значения факториалов больших чисел без непосредственного перемножения последовательности натуральных чисел. Так, с помощью формулы Стирлинга легко подсчитать, что
- 100! ≈ 9,33×10157;
- 1000! ≈ 4,02×102567;
- 10 000! ≈ 2,85×1035 659.
Разложение на простые числа
Каждое простое число p входит в разложение n! на простые множители в степени
- <math>leftlfloor frac{n}{p}rightrfloor + leftlfloor frac{n}{p^2}rightrfloor + leftlfloor frac{n}{p^3}rightrfloor + ldots.</math>
Таким образом,
- <math>n! = prod_{p} p^{lfloor frac{n}{p}rfloor + lfloor frac{n}{p^2}rfloor +ldots},</math>
где произведение берётся по всем простым числам. Нетрудно видеть, что для всякого простого p большего n соответствующий множитель в произведении равен 1, а потому произведение можно брать лишь по простым p, не превосходящим n.
Связь с производной от степенной функции
Для целого неотрицательного числа n:
- <math>left( x^n right)^{(n)}=n!</math>
Например:
- <math>left( x^5 right)^{(5)}
= left( 5 cdot x^4 right)^{(4)}
= left( 5 cdot 4 cdot x^3 right)
= left( 5 cdot 4 cdot 3 cdot x^2 right)
= left( 5 cdot 4 cdot 3 cdot 2 cdot x right)’
= {5 cdot 4 cdot 3 cdot 2 cdot 1} = 5!</math>
Другие свойства
- Для натурального числа n:
-
- <math>n!^2 geqslant n^n geqslant n! geqslant n</math>
Обобщения
Двойной факториал
Двойной факториал числа n обозначается n‼ и определяется как произведение всех натуральных чисел в отрезке [1,n], имеющих ту же чётность, что и n.
- <math>n!! = 2 cdot 4 cdot 6 cdot ldots cdot n = prod_{i=1}^{frac{n}{2}} 2i = 2^{{color{white}1}^{!!!! frac{n}{2}}} cdot left ( frac{n}{2} right )!</math>
- Для нечётного n:
- <math>n!! = {1 cdot 3 cdot 5 cdot ldots cdot n} = prod_{i=0}^{frac{n-1}{2}} (2i+1) = frac{n!}{2^{{color{white}1}^{!!!! frac{n-1}{2}}} cdot left ( frac{n-1}{2} right )!}</math>
Связь между двойными факториалами двух соседних целых неотрицательных чисел и обычным факториалом одного из них.
- <math>n!! = frac{(n+1)!}{(n+1)!!}</math>
- Для нечётного n:
- <math>n!! = frac{n!}{(n-1)!!}</math>
Выведение формул
- Формула для чётного n:
- <math>n!! = 2^{{color{white}1}^{!!!! frac{n}{2}}} cdot left ( frac{n}{2} right )!</math>
- Выведение формулы:
- <math>begin{align} n!! & = {color{Gray}underbrace{color{Black}2 cdot 4 cdot 6 cdot ldots cdot n}_{color{Black}tfrac{n}{2}}} = {color{Gray}underbrace{color{OliveGreen}2 cdot 2 cdot 2 cdot ldots cdot 2}_{color{Black}tfrac{n}{2}}} ; cdot ; frac{; 2 cdot 4 cdot 6 cdot ldots cdot n ;}{color{Gray}underbrace{color{OliveGreen}2 cdot 2 cdot 2 cdot ldots cdot 2}_{color{Black}tfrac{n}{2}}} =
\ & = {2^{{color{white}1}^{!!!! frac{n}{2}}} cdot left ( 1 cdot 2 cdot 3 cdot ldots cdot frac{n}{2} right )} = 2^{{color{white}1}^{!!!! frac{n}{2}}} cdot left ( frac{n}{2} right )! end{align}</math>
- Пример, иллюстрирующий использованное выше выведение формулы:
- <math>begin{align} 14!! & = 2^{frac{14}{2}} cdot left ( frac{14}{2} right )! = 2^7 cdot 7! =
\ & = (2 cdot 2 cdot 2 cdot 2 cdot 2 cdot 2 cdot 2) cdot (1 cdot 2 cdot 3 cdot 4 cdot 5 cdot 6 cdot 7) =
\ & = (2 cdot 1) (2 cdot 2) (2 cdot 3) (2 cdot 4) (2 cdot 5) (2 cdot 6) (2 cdot 7) =
\ & = 2 cdot 4 cdot 6 cdot 8 cdot 10 cdot 12 cdot 14 = 645120 end{align}</math>
- Формула для нечётного n:
- <math>n!! = frac{n!}{2^{{color{white}1}^{!!!! frac{n-1}{2}}} cdot left ( frac{n-1}{2} right )!}</math>
- Выведение формулы:
- <math>begin{align}n!! & = {color{Gray}underbrace{{color{Black}1 cdot 3 cdot 5 cdot ldots cdot n}}_{color{Black}frac{n+1}{2}}}
= frac{{color{Gray}overbrace{color{OliveGreen}2 cdot 4 cdot 6 cdot ldots cdot (n-1)}^{color{Black}frac{n-1}{2}}} cdot {color{Gray}overbrace{color{Black}1 cdot 3 cdot 5 cdot 7 cdot ldots cdot (n-2) cdot n}^{color{Black}frac{n+1}{2}}}}
{color{Gray}underbrace{{color{OliveGreen}2 cdot 4 cdot 6 cdot ldots cdot (n-1)}}_{color{Black}frac{n-1}{2}}} =
\ & = frac{color{Gray}overbrace{color{Black}1 cdot {color{OliveGreen}2} cdot 3 cdot {color{OliveGreen}4} cdot 5 cdot {color{OliveGreen}6} cdot 7 cdot ldots cdot (n-2) cdot {color{OliveGreen}(n-1)} cdot n}^{color{Black}n}} {color{Gray}underbrace{{color{OliveGreen}2 cdot 4 cdot 6 cdot ldots cdot (n-1)}}_{color{Black}frac{n-1}{2}}}
= frac{n!}{color{Gray}underbrace{{color{Black}2 cdot 4 cdot 6 cdot ldots cdot (n-1)}}_{color{Black}frac{n-1}{2}}} = frac{n!}{(n-1)!!} end{align}</math>
- Таким образом можно показать связь между двойными факториалами двух соседних неотрицательных целых чисел через обычный факториал одного из них. Далее продолжим выведение формулы для двойного факториала нечётного n. Вернёмся на шаг назад (до возникновения в явном виде (n-1)!!) и осуществим некоторые тождественные алгебраические преобразования над знаменателем:
- <math>begin{align}& {color{Gray}underbrace{{color{Black}2 cdot 4 cdot 6 cdot ldots cdot (n-1)}}_{color{Black}frac{n-1}{2}}} = {color{Gray}underbrace{color{OliveGreen}2 cdot 2 cdot 2 cdot ldots cdot 2}_{color{Black}tfrac{n-1}{2}}} ; cdot ; frac{; 2 cdot 4 cdot 6 cdot ldots cdot (n-1) ;}{color{Gray}underbrace{color{OliveGreen}2 cdot 2 cdot 2 cdot ldots cdot 2}_{color{Black}tfrac{n-1}{2}}} =
\ & = {2^{{color{white}1}^{!!!! frac{n-1}{2}}} cdot left ( 1 cdot 2 cdot 3 cdot ldots cdot frac{n-1}{2} right )} = 2^{{color{white}1}^{!!!! frac{n-1}{2}}} cdot left ( frac{n-1}{2} right )! end{align}</math>
- Подставим полученное выражение для знаменателя обратно в формулу для <math>n!!</math>:
- <math>n!! = frac{n!}{2^{{color{white}1}^{!!!! frac{n-1}{2}}} cdot left ( frac{n-1}{2} right )!}</math>
Пример, иллюстрирующий использованное выше выведение формулы:
- <math>begin{align} 15!! & = frac{15!}{2^{{color{white}1}^{!!!! frac{15-1}{2}}} cdot left ( frac{15-1}{2} right )!}
\ & = {color{white}overbrace{color{Black}frac{1 cdot 2 cdot 3 cdot 4 cdot 5 cdot 6 cdot 7 cdot 8 cdot 9 cdot 10 cdot 11 cdot 12 cdot 13 cdot 14 cdot 15}{(2 cdot 2 cdot 2 cdot 2 cdot 2 cdot 2 cdot 2) cdot (1 cdot 2 cdot 3 cdot 4 cdot 5 cdot 6 cdot 7)}}} =
\ & = {color{white}overbrace{color{Black}frac{1 cdot 2 cdot 3 cdot 4 cdot 5 cdot 6 cdot 7 cdot 8 cdot 9 cdot 10 cdot 11 cdot 12 cdot 13 cdot 14 cdot 15}{(2 cdot 1) (2 cdot 2) (2 cdot 3) (2 cdot 4) (2 cdot 5) (2 cdot 6) (2 cdot 7)}}} =
\ & = {color{white}overbrace{color{Black}frac{1 cdot {color{OliveGreen}2} cdot 3 cdot {color{OliveGreen}4} cdot 5 cdot {color{OliveGreen}6} cdot 7 cdot {color{OliveGreen}8} cdot 9 cdot {color{OliveGreen}10} cdot 11 cdot {color{OliveGreen}12} cdot 13 cdot {color{OliveGreen}14} cdot 15}{color{OliveGreen}2 cdot 4 cdot 6 cdot 8 cdot 10 cdot 12 cdot 14}}} =
\ & = {color{white}overbrace{color{Black}1 cdot 3 cdot 5 cdot 7 cdot 9 cdot 11 cdot 13 cdot 15}} = 2027025 end{align}</math>
Осуществив замену <math>n=2k</math> для чётного n и <math>n=2k+1</math> для нечётного n соответственно, где <math>k</math> — целое неотрицательное число, получим:
- для чётного числа:
- <math>(2k)!! = 2 cdot 4 cdot 6 cdot ldots cdot 2k =prod_{i=1}^{k} 2i = 2^kcdot k!</math>
- для нечётного числа:
- <math>(2k+1)!! = 1 cdot 3 cdot 5 cdot ldots cdot (2k+1) = prod_{i=0}^{k} (2i+1) = frac{(2k+1)!}{2^kcdot k!}</math>
По договорённости: <math>0!! = 1</math>. Также это равенство выполняется естественным образом:
- <math>0!! = 2^0 cdot 0! = 1 cdot 1 = 1</math>
</div></div>
Двойной факториал, также как и обычный факториал, определён только для целых неотрицательных чисел.
Последовательность значений n!! начинается так[4]:
- 1, 1, 2, 3, 8, 15, 48, 105, 384, 945, 3840, 10 395, 46 080, 135 135, 645 120, 2 027 025, 10 321 920, 34 459 425, 185 794 560, 654 729 075, 3 715 891 200, 13 749 310 575, 81 749 606 400, 316 234 143 225, 1 961 990 553 600, 7 905 853 580 625, 51 011 754 393 600, …
Кратный факториал
m-кратный факториал числа n обозначается <math>textstyle nunderbrace{!!ldots !}_m</math> и определяется следующим образом. Пусть число n представимо в виде <math>n=mk-r,</math> где <math>k in mathbb{Z},</math> <math>r in {0,1,ldots ,m-1}.</math> Тогда[5]
- <math>nunderbrace{!!ldots !}_m = prod_{i=1}^k (mi-r)</math>
Обычный и двойной факториалы являются частными случаями m-кратного факториала для m = 1 и m = 2 соответственно.
Кратный факториал связан с гамма-функцией следующим соотношением[6]:
- <math>nunderbrace{!!ldots !}_m = prod_{i=1}^{k} (mi-r)=m^k cdot frac {Gamma left (k-frac {r} {m} +1 right )} {Gamma left ( 1- frac {r} {m} right)}.</math>
Неполный факториал
Убывающий факториал
Убывающим факториалом называется выражение
- <math>(n)_k = n^{underline{k}} = n^{[k]}= ncdot (n-1)cdot ldotscdot (n-k+1) = frac{n!}{(n-k)!} = prod_{i=n-k+1}^n i</math>.
Например:
- n = 7; k = 4,
- (n − k) + 1 = 4,
- nk = 7 • 6 • 5 • 4 = 840.
Убывающий факториал даёт число размещений из n по k.
Возрастающий факториал
Возрастающим факториалом называется выражение
- <math>n^{(k)} = n^{overline{k}} = ncdot (n+1)cdot ldotscdot (n+k-1) = frac{(n+k-1)!}{(n-1)!}=prod_{i=n}^{(n+k)-1} i.</math>
Праймориал или примориал
Праймориал или примориал (англ. primorial) числа n обозначается pn# и определяется как произведение n первых простых чисел. Например,
- <math>p_5# = 2 times 3 times 5 times 7 times 11 = 2310</math>.
Иногда праймориалом называют число <math>n#</math>, определяемое как произведение всех простых чисел, не превышающих заданное n.
Последовательность праймориалов (включая <math>{textstyle{1# equiv 1}}</math>) начинается так[7]:
- 1, 2, 6, 30, 210, 2310, 30 030, 510 510, 9 699 690, 223 092 870, 6 469 693 230, 200 560 490 130, 7 420 738 134 810, 304 250 263 527 210, 13 082 761 331 670 030, 614 889 782 588 491 410, 32 589 158 477 190 044 730, 1 922 760 350 154 212 639 070, …
Суперфакториалы
Нейл Слоан и Симон Плуффэ (англ.) в 1995 году определили суперфакториал как произведение первых n факториалов. Согласно этому определению, суперфакториал четырёх равен
- <math> operatorname{sf}(4)=1! times 2! times 3! times 4!=288</math>
(поскольку устоявшегося обозначения нет, используется функциональное).
В общем
- <math>
operatorname{sf}(n) =prod_{k=1}^n k! =prod_{k=1}^n k^{n-k+1} =1^ncdot2^{n-1}cdot3^{n-2}cdots(n-1)^2cdot n^1. </math>
Последовательность суперфакториалов чисел <math>n geqslant 0</math> начинается так[8]:
- 1, 1, 2, 12, 288, 34 560, 24 883 200, 125 411 328 000, 5 056 584 744 960 000, 1 834 933 472 251 084 800 000, 6 658 606 584 104 736 522 240 000 000, 265 790 267 296 391 946 810 949 632 000 000 000, 127 313 963 299 399 416 749 559 771 247 411 200 000 000 000, …
Идея была обобщена в 2000 году Генри Боттомли (англ.), что привело к гиперфакториалам (англ. Superduperfactorial), которые являются произведением первых n суперфакториалов. Последовательность гиперфакториалов чисел <math>n geqslant 0</math> начинается так[9]:
- 1, 1, 2, 24, 6912, 238 878 720, 5 944 066 965 504 000, 745 453 331 864 786 829 312 000 000, 3 769 447 945 987 085 350 501 386 572 267 520 000 000 000, 6 916 686 207 999 802 072 984 424 331 678 589 933 649 915 805 696 000 000 000 000 000, …
Продолжая рекуррентно, можно определить факториал кратного уровня, или m-уровневый факториал числа n, как произведение (m − 1)-уровневых факториалов чисел от 1 до n, то есть
- <math>operatorname{mf}(n,m) = operatorname{mf}(n-1,m)operatorname{mf}(n,m-1)=prod_{k=1}^n k^{n-k+m-1 choose n-k}, </math>
где <math>operatorname{mf}(n,0)=n</math> для <math>n>0</math> и <math>operatorname{mf}(0,m)=1.</math>
Субфакториал
Субфакториал !n определяется как количество беспорядков порядка n, то есть перестановок n-элементного множества без неподвижных точек.
См. также
Напишите отзыв о статье «Факториал»
Примечания
- ↑ Последовательность A000142 в OEIS
- ↑ [www-history.mcs.st-andrews.ac.uk/Biographies/Kramp.html Крамп, Кристиан]
- ↑ Коэффициенты этого разложения дают A001163 (числители) и A001164 (знаменатели)
- ↑ Последовательность A006882 в OEIS
- ↑ «Энциклопедия для детей» Аванта+. Математика.
- ↑ [www.wolframalpha.com/input/?i=product+%28m*i-r%29%2C+i%3D1..k wolframalpha.com].
- ↑ Последовательность A002110 в OEIS
- ↑ Последовательность A000178 в OEIS
- ↑ Последовательность A055462 в OEIS
Отрывок, характеризующий Факториал
– Молодцы! – сказал, смеясь, Ростов. – Что, сено есть?
– И одинакие какие… – сказал Ильин.
– Развесе…oo…ооо…лая бесе… бесе… – распевали мужики с счастливыми улыбками.
Один мужик вышел из толпы и подошел к Ростову.
– Вы из каких будете? – спросил он.
– Французы, – отвечал, смеючись, Ильин. – Вот и Наполеон сам, – сказал он, указывая на Лаврушку.
– Стало быть, русские будете? – переспросил мужик.
– А много вашей силы тут? – спросил другой небольшой мужик, подходя к ним.
– Много, много, – отвечал Ростов. – Да вы что ж собрались тут? – прибавил он. – Праздник, что ль?
– Старички собрались, по мирскому делу, – отвечал мужик, отходя от него.
В это время по дороге от барского дома показались две женщины и человек в белой шляпе, шедшие к офицерам.
– В розовом моя, чур не отбивать! – сказал Ильин, заметив решительно подвигавшуюся к нему Дуняшу.
– Наша будет! – подмигнув, сказал Ильину Лаврушка.
– Что, моя красавица, нужно? – сказал Ильин, улыбаясь.
– Княжна приказали узнать, какого вы полка и ваши фамилии?
– Это граф Ростов, эскадронный командир, а я ваш покорный слуга.
– Бе…се…е…ду…шка! – распевал пьяный мужик, счастливо улыбаясь и глядя на Ильина, разговаривающего с девушкой. Вслед за Дуняшей подошел к Ростову Алпатыч, еще издали сняв свою шляпу.
– Осмелюсь обеспокоить, ваше благородие, – сказал он с почтительностью, но с относительным пренебрежением к юности этого офицера и заложив руку за пазуху. – Моя госпожа, дочь скончавшегося сего пятнадцатого числа генерал аншефа князя Николая Андреевича Болконского, находясь в затруднении по случаю невежества этих лиц, – он указал на мужиков, – просит вас пожаловать… не угодно ли будет, – с грустной улыбкой сказал Алпатыч, – отъехать несколько, а то не так удобно при… – Алпатыч указал на двух мужиков, которые сзади так и носились около него, как слепни около лошади.
– А!.. Алпатыч… А? Яков Алпатыч!.. Важно! прости ради Христа. Важно! А?.. – говорили мужики, радостно улыбаясь ему. Ростов посмотрел на пьяных стариков и улыбнулся.
– Или, может, это утешает ваше сиятельство? – сказал Яков Алпатыч с степенным видом, не заложенной за пазуху рукой указывая на стариков.
– Нет, тут утешенья мало, – сказал Ростов и отъехал. – В чем дело? – спросил он.
– Осмелюсь доложить вашему сиятельству, что грубый народ здешний не желает выпустить госпожу из имения и угрожает отпречь лошадей, так что с утра все уложено и ее сиятельство не могут выехать.
– Не может быть! – вскрикнул Ростов.
– Имею честь докладывать вам сущую правду, – повторил Алпатыч.
Ростов слез с лошади и, передав ее вестовому, пошел с Алпатычем к дому, расспрашивая его о подробностях дела. Действительно, вчерашнее предложение княжны мужикам хлеба, ее объяснение с Дроном и с сходкою так испортили дело, что Дрон окончательно сдал ключи, присоединился к мужикам и не являлся по требованию Алпатыча и что поутру, когда княжна велела закладывать, чтобы ехать, мужики вышли большой толпой к амбару и выслали сказать, что они не выпустят княжны из деревни, что есть приказ, чтобы не вывозиться, и они выпрягут лошадей. Алпатыч выходил к ним, усовещивая их, но ему отвечали (больше всех говорил Карп; Дрон не показывался из толпы), что княжну нельзя выпустить, что на то приказ есть; а что пускай княжна остается, и они по старому будут служить ей и во всем повиноваться.
В ту минуту, когда Ростов и Ильин проскакали по дороге, княжна Марья, несмотря на отговариванье Алпатыча, няни и девушек, велела закладывать и хотела ехать; но, увидав проскакавших кавалеристов, их приняли за французов, кучера разбежались, и в доме поднялся плач женщин.
– Батюшка! отец родной! бог тебя послал, – говорили умиленные голоса, в то время как Ростов проходил через переднюю.
Княжна Марья, потерянная и бессильная, сидела в зале, в то время как к ней ввели Ростова. Она не понимала, кто он, и зачем он, и что с нею будет. Увидав его русское лицо и по входу его и первым сказанным словам признав его за человека своего круга, она взглянула на него своим глубоким и лучистым взглядом и начала говорить обрывавшимся и дрожавшим от волнения голосом. Ростову тотчас же представилось что то романическое в этой встрече. «Беззащитная, убитая горем девушка, одна, оставленная на произвол грубых, бунтующих мужиков! И какая то странная судьба натолкнула меня сюда! – думал Ростов, слушяя ее и глядя на нее. – И какая кротость, благородство в ее чертах и в выражении! – думал он, слушая ее робкий рассказ.
Когда она заговорила о том, что все это случилось на другой день после похорон отца, ее голос задрожал. Она отвернулась и потом, как бы боясь, чтобы Ростов не принял ее слова за желание разжалобить его, вопросительно испуганно взглянула на него. У Ростова слезы стояли в глазах. Княжна Марья заметила это и благодарно посмотрела на Ростова тем своим лучистым взглядом, который заставлял забывать некрасивость ее лица.
– Не могу выразить, княжна, как я счастлив тем, что я случайно заехал сюда и буду в состоянии показать вам свою готовность, – сказал Ростов, вставая. – Извольте ехать, и я отвечаю вам своей честью, что ни один человек не посмеет сделать вам неприятность, ежели вы мне только позволите конвоировать вас, – и, почтительно поклонившись, как кланяются дамам царской крови, он направился к двери.
Почтительностью своего тона Ростов как будто показывал, что, несмотря на то, что он за счастье бы счел свое знакомство с нею, он не хотел пользоваться случаем ее несчастия для сближения с нею.
Княжна Марья поняла и оценила этот тон.
– Я очень, очень благодарна вам, – сказала ему княжна по французски, – но надеюсь, что все это было только недоразуменье и что никто не виноват в том. – Княжна вдруг заплакала. – Извините меня, – сказала она.
Ростов, нахмурившись, еще раз низко поклонился и вышел из комнаты.
– Ну что, мила? Нет, брат, розовая моя прелесть, и Дуняшей зовут… – Но, взглянув на лицо Ростова, Ильин замолк. Он видел, что его герой и командир находился совсем в другом строе мыслей.
Ростов злобно оглянулся на Ильина и, не отвечая ему, быстрыми шагами направился к деревне.
– Я им покажу, я им задам, разбойникам! – говорил он про себя.
Алпатыч плывущим шагом, чтобы только не бежать, рысью едва догнал Ростова.
– Какое решение изволили принять? – сказал он, догнав его.
Ростов остановился и, сжав кулаки, вдруг грозно подвинулся на Алпатыча.
– Решенье? Какое решенье? Старый хрыч! – крикнул он на него. – Ты чего смотрел? А? Мужики бунтуют, а ты не умеешь справиться? Ты сам изменник. Знаю я вас, шкуру спущу со всех… – И, как будто боясь растратить понапрасну запас своей горячности, он оставил Алпатыча и быстро пошел вперед. Алпатыч, подавив чувство оскорбления, плывущим шагом поспевал за Ростовым и продолжал сообщать ему свои соображения. Он говорил, что мужики находились в закоснелости, что в настоящую минуту было неблагоразумно противуборствовать им, не имея военной команды, что не лучше ли бы было послать прежде за командой.
– Я им дам воинскую команду… Я их попротивоборствую, – бессмысленно приговаривал Николай, задыхаясь от неразумной животной злобы и потребности излить эту злобу. Не соображая того, что будет делать, бессознательно, быстрым, решительным шагом он подвигался к толпе. И чем ближе он подвигался к ней, тем больше чувствовал Алпатыч, что неблагоразумный поступок его может произвести хорошие результаты. То же чувствовали и мужики толпы, глядя на его быструю и твердую походку и решительное, нахмуренное лицо.
После того как гусары въехали в деревню и Ростов прошел к княжне, в толпе произошло замешательство и раздор. Некоторые мужики стали говорить, что эти приехавшие были русские и как бы они не обиделись тем, что не выпускают барышню. Дрон был того же мнения; но как только он выразил его, так Карп и другие мужики напали на бывшего старосту.
– Ты мир то поедом ел сколько годов? – кричал на него Карп. – Тебе все одно! Ты кубышку выроешь, увезешь, тебе что, разори наши дома али нет?
– Сказано, порядок чтоб был, не езди никто из домов, чтобы ни синь пороха не вывозить, – вот она и вся! – кричал другой.
– Очередь на твоего сына была, а ты небось гладуха своего пожалел, – вдруг быстро заговорил маленький старичок, нападая на Дрона, – а моего Ваньку забрил. Эх, умирать будем!
– То то умирать будем!
– Я от миру не отказчик, – говорил Дрон.
– То то не отказчик, брюхо отрастил!..
Два длинные мужика говорили свое. Как только Ростов, сопутствуемый Ильиным, Лаврушкой и Алпатычем, подошел к толпе, Карп, заложив пальцы за кушак, слегка улыбаясь, вышел вперед. Дрон, напротив, зашел в задние ряды, и толпа сдвинулась плотнее.
– Эй! кто у вас староста тут? – крикнул Ростов, быстрым шагом подойдя к толпе.
– Староста то? На что вам?.. – спросил Карп. Но не успел он договорить, как шапка слетела с него и голова мотнулась набок от сильного удара.
– Шапки долой, изменники! – крикнул полнокровный голос Ростова. – Где староста? – неистовым голосом кричал он.
– Старосту, старосту кличет… Дрон Захарыч, вас, – послышались кое где торопливо покорные голоса, и шапки стали сниматься с голов.
– Нам бунтовать нельзя, мы порядки блюдем, – проговорил Карп, и несколько голосов сзади в то же мгновенье заговорили вдруг:
– Как старички пороптали, много вас начальства…
– Разговаривать?.. Бунт!.. Разбойники! Изменники! – бессмысленно, не своим голосом завопил Ростов, хватая за юрот Карпа. – Вяжи его, вяжи! – кричал он, хотя некому было вязать его, кроме Лаврушки и Алпатыча.
Лаврушка, однако, подбежал к Карпу и схватил его сзади за руки.
– Прикажете наших из под горы кликнуть? – крикнул он.
Алпатыч обратился к мужикам, вызывая двоих по именам, чтобы вязать Карпа. Мужики покорно вышли из толпы и стали распоясываться.
– Староста где? – кричал Ростов.
Дрон, с нахмуренным и бледным лицом, вышел из толпы.
– Ты староста? Вязать, Лаврушка! – кричал Ростов, как будто и это приказание не могло встретить препятствий. И действительно, еще два мужика стали вязать Дрона, который, как бы помогая им, снял с себя кушан и подал им.
– А вы все слушайте меня, – Ростов обратился к мужикам: – Сейчас марш по домам, и чтобы голоса вашего я не слыхал.
– Что ж, мы никакой обиды не делали. Мы только, значит, по глупости. Только вздор наделали… Я же сказывал, что непорядки, – послышались голоса, упрекавшие друг друга.
– Вот я же вам говорил, – сказал Алпатыч, вступая в свои права. – Нехорошо, ребята!
– Глупость наша, Яков Алпатыч, – отвечали голоса, и толпа тотчас же стала расходиться и рассыпаться по деревне.
Связанных двух мужиков повели на барский двор. Два пьяные мужика шли за ними.
– Эх, посмотрю я на тебя! – говорил один из них, обращаясь к Карпу.
– Разве можно так с господами говорить? Ты думал что?
– Дурак, – подтверждал другой, – право, дурак!
Через два часа подводы стояли на дворе богучаровского дома. Мужики оживленно выносили и укладывали на подводы господские вещи, и Дрон, по желанию княжны Марьи выпущенный из рундука, куда его заперли, стоя на дворе, распоряжался мужиками.
– Ты ее так дурно не клади, – говорил один из мужиков, высокий человек с круглым улыбающимся лицом, принимая из рук горничной шкатулку. – Она ведь тоже денег стоит. Что же ты ее так то вот бросишь или пол веревку – а она потрется. Я так не люблю. А чтоб все честно, по закону было. Вот так то под рогожку, да сенцом прикрой, вот и важно. Любо!
– Ишь книг то, книг, – сказал другой мужик, выносивший библиотечные шкафы князя Андрея. – Ты не цепляй! А грузно, ребята, книги здоровые!
– Да, писали, не гуляли! – значительно подмигнув, сказал высокий круглолицый мужик, указывая на толстые лексиконы, лежавшие сверху.
Ростов, не желая навязывать свое знакомство княжне, не пошел к ней, а остался в деревне, ожидая ее выезда. Дождавшись выезда экипажей княжны Марьи из дома, Ростов сел верхом и до пути, занятого нашими войсками, в двенадцати верстах от Богучарова, верхом провожал ее. В Янкове, на постоялом дворе, он простился с нею почтительно, в первый раз позволив себе поцеловать ее руку.
– Как вам не совестно, – краснея, отвечал он княжне Марье на выражение благодарности за ее спасенье (как она называла его поступок), – каждый становой сделал бы то же. Если бы нам только приходилось воевать с мужиками, мы бы не допустили так далеко неприятеля, – говорил он, стыдясь чего то и стараясь переменить разговор. – Я счастлив только, что имел случай познакомиться с вами. Прощайте, княжна, желаю вам счастия и утешения и желаю встретиться с вами при более счастливых условиях. Ежели вы не хотите заставить краснеть меня, пожалуйста, не благодарите.
Но княжна, если не благодарила более словами, благодарила его всем выражением своего сиявшего благодарностью и нежностью лица. Она не могла верить ему, что ей не за что благодарить его. Напротив, для нее несомненно было то, что ежели бы его не было, то она, наверное, должна была бы погибнуть и от бунтовщиков и от французов; что он, для того чтобы спасти ее, подвергал себя самым очевидным и страшным опасностям; и еще несомненнее было то, что он был человек с высокой и благородной душой, который умел понять ее положение и горе. Его добрые и честные глаза с выступившими на них слезами, в то время как она сама, заплакав, говорила с ним о своей потере, не выходили из ее воображения.
wiki-org.ru
Факториал простыми словами
Факториал: определение из Википедии
Факториа́л числа n (лат. factorialis — действующий, производящий, умножающий; обозначается n!, произносится эн факториа́л) — произведение всех натуральных чисел от 1 до n включительно:
n
!
=
1
⋅
2
⋅
…
⋅
n
=
∏
i
=
1
n
i
.
{displaystyle n!=1cdot 2cdot ldots cdot n=prod _{i=1}^{n}i.}
Например:
5
!
=
1
⋅
2
⋅
3
⋅
4
⋅
5
=
120
{displaystyle 5!=1cdot 2cdot 3cdot 4cdot 5=120}
.
По договорённости:
0
!
=
1
{displaystyle 0!=1}
. Также это равенство выполняется естественным образом:
0
!
=
(
n
−
1
)
!
|
n
=
1
=
n
!
n
|
n
=
1
=
1
!
1
=
1
{displaystyle 0!={Bigl .}(n-1)!{Bigr |}_{n=1}={Bigl .}{frac {n!}{n}}{Bigr |}_{n=1}={frac {1!}{1}}=1}
Факториал определён только для целых неотрицательных чисел.
Последовательность факториалов неотрицательных целых чисел начинается так:
1, 1, 2, 6, 24, 120, 720, 5040, 40 320, 362 880, 3 628 800, 39 916 800, 479 001 600, 6 227 020 800, 87 178 291 200, 1 307 674 368 000, 20 922 789 888 000, 355 687 428 096 000, 6 402 373 705 728 000, 121 645 100 408 832 000, 2 432 902 008 176 640 000, …
Факториалы часто используются в комбинаторике, теории чисел и функциональном анализе.
Факториал является чрезвычайно быстро растущей функцией. Он растёт быстрее, чем многочлен любой степени, и быстрее, чем экспоненциальная функция (но медленнее, чем двойная экспоненциальная функция
e
e
n
{displaystyle e^{e^{n}}}
).
Факториал: определение из словаря Ефремовой
м.
Произведение чисел натурального ряда от единицы до некоторого данного числа (в
математике).
На текущей странице дано определение слова факториал простым языком.
Надеемся, что после прочтения этого объяснения простыми словами, у вас больше не осталось вопросов,
что такое факториал.
wikisimple.ru
Факториал Википедия
Факториа́л — функция, определённая на множестве неотрицательных целых чисел. Название происходит от лат. factorialis — действующий, производящий, умножающий; обозначается n!, произносится эн факториа́л. Факториал натурального числа n определяется как произведение всех натуральных чисел от 1 до n включительно:
- n!=1⋅2⋅…⋅n=∏k=1nk{displaystyle n!=1cdot 2cdot ldots cdot n=prod _{k=1}^{n}k}.
Например,
- 5!=1⋅2⋅3⋅4⋅5=120{displaystyle 5!=1cdot 2cdot 3cdot 4cdot 5=120}.
Из определения факториала следует соотношение (n−1)!=n!n{displaystyle (n-1)!={frac {n!}{n}}}, откуда при n=1{displaystyle n=1} формально находим
- 0!=1{displaystyle 0!=1}.
Последнее равенство обычно принимают в качестве соглашения, хотя, как показано выше, оно следует из определения факториала для натуральных чисел при условии, что все значения функции связаны единым рекуррентным соотношением.
n | n! |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 6 |
4 | 24 |
5 | 120 |
6 | 720 |
7 | 5040 |
8 | 40320 |
9 | 362880 |
10 | 3628800 |
11 | 39916800 |
12 | 479001600 |
13 | 6227020800 |
14 | 87178291200 |
15 | 1307674368000 |
16 | 20922789888000 |
17 | 355687428096000 |
18 | 6402373705728000 |
19 | 121645100408832000 |
20 | 2432902008176640000 |
25 | ≈1,551121004⋅1025 |
50 | ≈3,041409320⋅1064 |
70 | ≈1,197857167⋅10100 |
100 | ≈9,332621544⋅10157 |
450 | ≈1,733368733⋅101000 |
1000 | ≈4,023872601⋅102567 |
3249 | ≈6,412337688⋅1010000 |
10000 | ≈2,846259681⋅1035659 |
25206 | ≈1,205703438⋅10100000 |
100000 | ≈2,824229408⋅10456573 |
205023 | ≈2,503898932⋅101000004 |
1000000 | ≈8,263931688⋅105565708 |
10100 | ≈109,956570552⋅10101 |
101000 | ≈10101003 |
1010 000 | ≈101010 004 |
10100 000 | ≈1010100 005 |
1010100 | ≈101010100 |
Факториал активно используется в различных разделах математики: комбинаторике, математическом анализе,
ru-wiki.ru
Свойства простых чисел впервые начали изучать математики Древней Греции. Математики пифагорейской школы (500 — 300 до н.э.) в первую очередь интересовались мистическими и нумерологическими свойствами простых чисел. Они первыми пришли к идеям о совершенных и дружественных числах.
Простые числа делятся без остатка на единицу и на самих себя. Они – основа арифметики и всех натуральных чисел. То есть тех, которые возникают естественным образом при счете предметов, например, яблок. Любое натуральное число это произведение каких-нибудь простых чисел.
И тех и других – бесконечное множество.
Простые числа, кроме 2 и 5, заканчиваются на 1, на 3, на 7 или на 9. Считалось, что они распределены случайным образом. И за простым числом, оканчивающимся, к примеру, на 1 может с равной вероятностью – в 25 процентов – следовать простое число, которое оканчивается на 1, 3, 7, 9.
Простые числа — это целые числа больше единицы, которые не могут быть представлены как произведение двух меньших чисел. Таким образом, 6 — это не простое число, так как оно может быть представлено как произведение 2×3, а 5 — это простое число, потому что единственный способ представить его как произведение двух чисел — это 1×5 или 5×1. Если у вас есть несколько монет, но вы не можете расположить их все в форме прямоугольника, а можете только выстроить их в прямую линию, ваше число монет — это простое число.
У совершенного числа сумма его собственных делителей равна ему самому. Например, собственные делители числа 6: 1, 2 и 3. 1 + 2 + 3 = 6. У числа 28 делители — это 1, 2, 4, 7 и 14. При этом, 1 + 2 + 4 + 7 + 14 = 28.
Числа называются дружественными, если сумма собственных делителей одного числа равна другому, и наоборот – например, 220 и 284. Можно сказать, что совершенное число является дружественным для самого себя.
Ко времени появления работы Евклида «Начала» в 300 году до н.э. уже было доказано несколько важных фактов касательно простых чисел. В книге IX «Начал» Эвклид доказал, что простых чисел бесконечное количество. Это, кстати, один из первых примеров использования доказательства от противного. Также он доказывает Основную теорему арифметики – каждое целое число можно представить единственным образом в виде произведения простых чисел.
Также он показал, что если число 2n-1 является простым, то число 2n-1 * (2n-1) будет совершенным. Другой математик, Эйлер, в 1747 году сумел показать, что все чётные совершенные числа можно записать в таком виде. По сей день неизвестно, существуют ли нечётные совершенные числа.
В году 200 году до н.э. грек Эратосфен придумал алгоритм для поиска простых чисел под названием «Решето Эратосфена».
Никто точно не знает, в каком обществе стали впервые рассматривать простые числа. Их изучают так давно, что у ученых нет записей тех времен. Есть предположения, что некоторые ранние цивилизации имели какое-то понимание простых чисел, но первым реальным доказательством этого являются египетские записи на папирусах, сделанные более 3500 лет назад.
Древние греки, скорее всего, были первыми, кто изучал простые числа как предмет научного интереса, и они считали, что простые числа важны для чисто абстрактной математики. Теорему Евклида по-прежнему изучают в школах, несмотря на то что ей уже больше 2000 лет.
После греков серьезное внимание простым числам снова уделили в XVII веке. С тех пор многие известные математики внесли важный вклад в наше понимание простых чисел. Пьер де Ферма совершил множество открытий и известен благодаря Великой теореме Ферма, 350-летней проблеме, связанной с простыми числами и решенной Эндрю Уайлсом в 1994 году. Леонард Эйлер доказал много теорем в XVIII веке, а в XIX веке большой прорыв был сделан благодаря Карлу Фридриху Гауссу, Пафнутию Чебышёву и Бернхарду Риману, особенно в отношении распределения простых чисел. Кульминацией всего этого стала до сих пор не решенная гипотеза Римана, которую часто называют важнейшей нерешенной задачей всей математики. Гипотеза Римана позволяет очень точно предсказать появление простых чисел, а также отчасти объясняет, почему они так трудно даются математикам.
Открытия сделаные в начале 17-го века математиком Ферма, доказали гипотезу Альбера Жирара, что любое простое число вида 4n+1 можно записать уникальным образом в виде суммы двух квадратов, и также сформулировал теорему о том, что любое число можно представить в виде суммы четырёх квадратов.
Он разработал новый метод факторизации больших чисел, и продемонстрировал его на числе 2027651281 = 44021 × 46061. Также он доказал Малую теорему Ферма: если p – простое число, то для любого целого a будет верно ap = a modulo p.
Это утверждение доказывает половину того, что было известно как «китайская гипотеза», и датируется 2000 годами ранее: целое n является простым тогда и только тогда, если 2n-2 делится на n. Вторая часть гипотезы оказалась ложной – к примеру, 2341 — 2 делится на 341, хотя число 341 составное: 341 = 31 × 11.
Малая теорема Ферма послужила основой множества других результатов в теории чисел и методов проверки чисел на принадлежность к простым – многие из которых используются и по сей день.
Ферма много переписывался со своими современниками, в особенности с монахом по имени Марен Мерсенн. В одном из писем он высказал гипотезу о том, что числа вида 2n+1 всегда будут простыми, если n является степенью двойки. Он проверил это для n = 1, 2, 4, 8 и 16, и был уверен, что в случае, когда n не является степенью двойки, число не обязательно получалось простым. Эти числа называются числами Ферма, и лишь через 100 лет Эйлер показал, что следующее число, 232 + 1 = 4294967297 делится на 641, и следовательно, не является простым.
Числа вида 2n — 1 также служили предметом исследований, поскольку легко показать, что если n – составное, то и само число тоже составное. Эти числа называют числами Мерсенна, поскольку он активно их изучал.
Но не все числа вида 2n — 1, где n – простое, являются простыми. К примеру, 211 — 1 = 2047 = 23 * 89. Впервые это обнаружили в 1536 году.
Многие годы числа такого вида давали математикам наибольшие известные простые числа. Что число M19, было доказано Катальди в 1588 году, и в течение 200 лет было наибольшим известным простым числом, пока Эйлер не доказал, что M31 также простое. Этот рекорд продержался ещё сто лет, а затем Люкас показал, что M127 — простое (а это уже число из 39 цифр), и после него исследования продолжились уже с появлением компьютеров.
В 1952 была доказана простота чисел M521, M607, M1279, M2203 и M2281.
К 2005 году найдено 42 простых чисел Мерсенна. Наибольшее из них, M25964951, состоит из 7816230 цифр.
Работа Эйлера оказала огромное влияние на теорию чисел, в том числе и простых. Он расширил Малую теорему Ферма и ввёл φ-функцию. Факторизовал 5-е число Ферма 232+1, нашёл 60 пар дружественных чисел, и сформулировал (но не смог доказать) квадратичный закон взаимности.
Он первым ввёл методы математического анализа и разработал аналитическую теорию чисел. Он доказал, что не только гармонический ряд ∑ (1/n), но и ряд вида
1/2 + 1/3 + 1/5 + 1/7 + 1/11 +…
получаемый суммой величин, обратных к простым числам, также расходится. Сумма n членов гармонического ряда растёт примерно как log(n), а второй ряд расходится медленнее, как log[ log(n) ]. Это значит, что, например, сумма обратных величин ко всем найденным на сегодняшний день простым числам даст всего 4, хотя ряд всё равно расходится.
На первый взгляд кажется, что простые числа распределены среди целых довольно случайно. К примеру, среди 100 чисел, идущих прямо перед 10000000, встречается 9 простых, а среди 100 чисел, идущих сразу после этого значения – всего 2. Но на больших отрезках простые числа распределены достаточно равномерно. Лежандр и Гаусс занимались вопросами их распределения. Гаусс как-то рассказывал другу, что в любые свободные 15 минут он всегда подсчитывает количество простых в очередной 1000 чисел. К концу жизни он сосчитал все простые числа в промежутке до 3 миллионов. Лежандр и Гаусс одинаково вычислили, что для больших n плотность простых чисел составляет 1/log(n). Лежандр оценил количество простых чисел в промежутке от 1 до n, как
π(n) = n/(log(n) — 1.08366)
А Гаусс – как логарифмический интеграл
π(n) = ∫ 1/log(t) dt
с промежутком интегрирования от 2 до n.
Утверждение о плотности простых чисел 1/log(n) известно как Теорема о распределении простых чисел. Её пытались доказать в течение всего 19 века, а прогресса достигли Чебышёв и Риман. Они связали её с гипотезой Римана – по сию пору не доказанной гипотезой о распределении нулей дзета-функции Римана. Плотность простых чисел была одновременно доказана Адамаром и Валле-Пуссеном в 1896 году.
В теории простых чисел есть ещё множество нерешённых вопросов, некоторым из которых уже многие сотни лет:
- гипотеза о простых числах-близнецах – о бесконечном количестве пар простых чисел, отличающихся друг от друга на 2
- гипотеза Гольдбаха: любое чётное число, начиная с 4, можно представить в виде суммы двух простых чисел
- бесконечно ли количество простых чисел вида n2+ 1 ?
- всегда ли можно найти простое число между n2and (n + 1) 2? (факт, что между n и 2n всегда есть простое число, было доказан Чебышёвым)
- бесконечно ли число простых чисел Ферма? есть ли вообще простые числа Ферма после 4-го?
- существует ли арифметическая прогрессия из последовательных простых чисел для любой заданной длины? например, для длины 4: 251, 257, 263, 269. Максимальная из найденных длина равна 26.
- бесконечно ли число наборов из трёх последовательных простых чисел в арифметической прогрессии?
- n2— n + 41 – простое число для 0 ≤ n ≤ 40. Бесконечно ли количество таких простых чисел? Тот же вопрос для формулы n2 — 79 n + 1601. Эти числа простые для 0 ≤ n ≤ 79.
- бесконечно ли количество простых чисел вида n# + 1? (n# — результат перемножения всех простых чисел, меньших n)
- бесконечно ли количество простых чисел вида n# -1 ?
- бесконечно ли количество простых чисел вида n! + 1?
- бесконечно ли количество простых чисел вида n! – 1?
- если p – простое, всегда ли 2p-1 не содержит среди множителей квадратов простых чисел
- содержит ли последовательность Фибоначчи бесконечное количество простых чисел?
Некоторые считают, что простые числа не стоят глубокого изучения, но они имеют фундаментальное значение для математики. Каждое число может быть представлено уникальным способом в виде простых чисел, умноженных друг на друга. Это значит, что простые числа — это «атомы умножения», маленькие частички, из которых может быть построено что-то большое.
Так как простые числа — это строительные элементы целых чисел, которые получаются с помощью умножения, многие проблемы целых чисел могут быть сведены к проблемам простых чисел. Подобным образом некоторые задачи в химии могут быть решены с помощью атомного состава химических элементов, вовлеченных в систему. Таким образом, если бы существовало конечное число простых чисел, можно было бы просто проверить одно за другим на компьютере. Однако оказывается, что существует бесконечное множество простых чисел, которые на данный момент плохо понимают математики.
У простых чисел существует огромное количество применений как в области математики, так и за ее пределами. Простые числа в наши дни используются практически ежедневно, хотя чаще всего люди об этом не подозревают. Простые числа представляют такое значение для ученых, поскольку они являются атомами умножения. Множество абстрактных проблем, касающихся умножения, можно было бы решить, если бы люди знали больше о простых числах. Математики часто разбивают одну проблему на несколько маленьких, и простые числа могли бы помочь в этом, если бы понимали их лучше.
Вне математики основные способы применения простых чисел связаны с компьютерами. Компьютеры хранят все данные в виде последовательности нулей и единиц, которая может быть выражена целым числом. Многие компьютерные программы перемножают числа, привязанные к данным. Это означает, что под самой поверхностью лежат простые числа. Когда человек совершает любые онлайн-покупки, он пользуется тем, что есть способы умножения чисел, которые сложно расшифровать хакеру, но легко покупателю. Это работает за счет того, что простые числа не имеют особенных характеристик — в противном случае злоумышленник мог бы получить данные банковской карты.
Один из способов нахождения простых чисел — это компьютерный поиск. Путем многократной проверки того, является ли число множителем 2, 3, 4 и так далее, можно легко определить, простое ли оно. Если оно не является множителем любого меньшего числа, оно простое. В действительности это очень трудоемкий способ выяснения того, является ли число простым. Однако существуют более эффективные пути это определить. Эффективность этих алгоритмов для каждого числа является результатом теоретического прорыва 2002 года.
Простых чисел достаточно много, поэтому если взять большое число и прибавить к нему единицу, то можно наткнуться на простое число. В действительности многие компьютерные программы полагаются на то, что простые числа не слишком трудно найти. Это значит, что, если вы наугад выберете число из 100 знаков, ваш компьютер найдет большее простое число за несколько секунд. Поскольку 100-значных простых чисел больше, чем атомов во Вселенной, то вполне вероятно, что никто не будет знать наверняка, что это число простое.
Как правило, математики не ищут отдельных простых чисел на компьютере, однако они очень заинтересованы в простых числах с особыми свойствами. Есть две известные проблемы: существует ли бесконечное количество простых чисел, которые на один больше, чем квадрат (например, это имеет значение в теории групп), и существует ли бесконечное количество пар простых чисел, отличающихся друг от друга на 2.
Самое большое простое число, вычисленное проектом GIMPS [Great Internet Mersenne Prime Search], можно посмотреть в таблице на официальной странице проекта.
Самые большие близнецы среди простых чисел – это 2003663613 × 2195000 ± 1. Они состоят из 58711 цифр, и были найдены в 2007 году.
Самое большое факториальное простое число (вида n! ± 1) – это 147855! — 1. Оно состоит из 142891 цифр и было найдено в 2002.
Наибольшее праймориальное простое число (число вида n# ± 1) – это 1098133# + 1.
Чтобы записать новое простое число, найденное математиками, потребовалась бы книга более, чем в 7 тысяч страниц. Оно – это небывало большое число – состоит из 23 249 425 цифр. Обнаружить его удалось благодаря проекту распределенных вычислений GIMPS (Great Internet Mersenne Prime Search).
Простые числа – это такие, которые делятся на единицу и на самих себя. И больше ни на что. Найденное ныне относится еще и к так называемым числам Мерсенна, которые имеют вид 2 в степени n минус 1. Выразить рекордное число можно как 2 в степени 77232917 минус 1. Оно стало 50 известным числом Мерсенна.
Простые числа используют в криптографии – для шифрования. Они стоят немалых денег. Например, в 2009 году за одно из простых чисел было выплачена премия в $100 тысяч.
Несмотря на то, что простые числа изучаются уже более трех тысячелетий и имеют простое описание, о простых числах до сих пор известно на удивление мало. Например, математики знают, что единственной парой простых чисел, отличающихся на единицу, являются 2 и 3. Однако неизвестно, существует ли бесконечное количество пар простых чисел, отличающихся на 2. Предполагается, что существует, но это пока не доказано. Это проблема, которую можно объяснить ребенку школьного возраста, однако величайшие математические умы ломают над ней голову уже более 100 лет.
Многие из наиболее интересных вопросов о простых числах как с практической, так и с теоретической точки зрения заключаются в том, какое количество простых чисел имеет то или иное свойство. Ответ на самый простой вопрос — сколько есть простых чисел определенного размера — теоретически можно получить, решив гипотезу Римана. Дополнительный стимул доказать гипотезу Римана — приз размером в один миллион долларов, предложенный математическим институтом Клэя, равно как и почетное место среди самых выдающихся математиков всех времен.
Сейчас существуют неплохие способы предположить, каким будет правильный ответ на многие из этих вопросов. На данный момент догадки математиков проходят все численные эксперименты, и есть теоретические основания, чтобы на них полагаться. Однако для чистой математики и работы компьютерных алгоритмов чрезвычайно важно, чтобы эти догадки действительно были верными. Математики могут быть полностью удовлетворены, только имея неоспоримое доказательство.
Самым серьезным вызовом для практического применения является сложность нахождения всех простых множителей числа. Если взять число 15, можно быстро определить, что 15=5х3. Но если взять 1000-значное число, вычисление всех его простых множителей займет больше миллиарда лет даже у самого мощного суперкомпьютера в мире. Интернет-безопасность во многом зависит от сложности таких вычислений, потому для безопасности коммуникации важно знать, что кто-то не может просто взять и придумать быстрый способ найти простые множители.
Сейчас невозможно сказать, как простые числа будут использоваться в будущем. Чистая математика (например, изучение простых чисел) неоднократно находила способы применения, которые могли показаться совершенно невероятными, когда теория впервые разрабатывалась. Снова и снова идеи, воспринимавшиеся как чудной академический интерес, непригодный в реальном мире, оказывались на удивление полезными для науки и техники. Годфри Харольд Харди, известный математик начала XX столетия, утверждал, что простые числа не имеют реального применения. Сорок лет спустя был открыт потенциал простых чисел для компьютерной коммуникации, и сейчас они жизненно необходимы для повседневного использования интернета.
Поскольку простые числа лежат в основе проблем, касающихся целых чисел, а целые числа постоянно встречаются в реальной жизни, простым числам найдется повсеместное применение в мире будущего. Это особенно актуально, учитывая, как интернет проникает в жизнь, а технологии и компьютеры играют большую роль, чем когда-либо раньше.
Существует мнение, что определенные аспекты теории чисел и простых чисел выходят далеко за рамки науки и компьютеров. В музыке простые числа объясняют, почему некоторые сложные ритмические рисунки долго повторяются. Это порой используется в современной классической музыке для достижения специфического звукового эффекта. Последовательность Фибоначчи постоянно встречается в природе, и есть гипотеза о том, что цикады эволюционировали таким образом, чтобы находиться в спячке в течение простого числа лет для получения эволюционного преимущества.
Также предполагается, что передача простых чисел по радиоволнам была бы лучшим способом для попытки установления связи с инопланетными формами жизни, поскольку простые числа абсолютно независимы от любого представления о языке, но при этом достаточно сложны, чтобы их нельзя было спутать с результатом некоего в чистом виде физического природного процесса.
[источники]Источники:
https://habrahabr.ru/post/276037/
https://postnauka.ru/faq/66114
0 / 0 / 0 Регистрация: 22.09.2012 Сообщений: 14 |
|
1 |
|
22.09.2012, 14:15. Показов 6318. Ответов 7
Вредный препод дал мне такую задачку: Дано натуральное n>0. Найти произведение первых n простых чисел. Следуя капризам препода, в решении нельзя использовать строки, функции и массивы.
0 |
15 / 6 / 0 Регистрация: 22.09.2012 Сообщений: 83 |
|
22.09.2012, 18:18 |
2 |
Вредный препод дал мне такую задачку: Дано натуральное n>0. Найти произведение первых n простых чисел. Следуя капризам препода, в решении нельзя использовать строки, функции и массивы. “Определите функцию” Или вы что-то не так поняли, или препод троллит.
0 |
0 / 0 / 0 Регистрация: 22.09.2012 Сообщений: 14 |
|
22.09.2012, 18:25 [ТС] |
3 |
Не исключено что подразумевается вариант нахождения алгоритма, определяющего простые числа.
0 |
CodeR Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,540 Записей в блоге: 1 |
||||
22.09.2012, 18:57 |
4 |
|||
Вот те алгоритм…
1 |
0 / 0 / 0 Регистрация: 22.09.2012 Сообщений: 14 |
|
22.09.2012, 19:17 [ТС] |
5 |
Спасибо, мне бы еще этот алгоритм запустить в действие и заставить перемножать заданное n-ое кол-во найденных простых чисел.
0 |
15 / 6 / 0 Регистрация: 22.09.2012 Сообщений: 83 |
|
22.09.2012, 19:18 |
6 |
Спасибо, мне бы еще этот алгоритм запустить в действие и заставить перемножать заданное n-ое кол-во найденных простых чисел. Это и есть программный код -.-
0 |
0 / 0 / 0 Регистрация: 22.09.2012 Сообщений: 14 |
|
22.09.2012, 19:33 [ТС] |
7 |
Suvitruf, Уважаемый, прошу внимательнее прочесть то, что я написал, не считайте себя умнее других.
0 |
CodeR Фрилансер 3417 / 2814 / 3000 Регистрация: 08.02.2012 Сообщений: 8,540 Записей в блоге: 1 |
||||
22.09.2012, 19:38 |
8 |
|||
1 |