Простые числа — основа теории чисел, но их поиск вручную среди сотен строк Excel может занять часы. К счастью, электронные таблицы умеют автоматизировать эту задачу: от элементарных формул до сложных алгоритмов на VBA. В этой статье вы найдёте 5 проверенных методов — от самого простого (для новичков) до оптимизированных решений для работы с большими массивами данных.
Многие ошибочно думают, что для проверки простоты числа в Excel обязательно знать программирование. На самом деле, даже стандартных функций ЕСЛИ, ОСТАТ и КОРЕНЬ достаточно для базовой проверки. А если вам нужно обработать столбец из 10 000 чисел — мы покажем, как ускорить процесс в 100 раз с помощью Power Query или макросов. Спойлер: самый быстрый метод описан в последнем разделе.
Прежде чем переходить к практике, давайте вспомним определение: простое число — это натуральное число больше 1, которое делится только на 1 и на само себя. Примеры: 2, 3, 5, 7, 11. Число 1 простым не считается (это важно для корректных формул!). В Excel проверка простоты сводится к поиску делителей числа в диапазоне от 2 до его квадратного корня — это ключевая оптимизация, которую часто упускают.
Метод 1: Проверка простоты числа без программирования (формула для одной ячейки)
Если вам нужно проверить одно число (например, в ячейке A1), используйте эту формулу:
=ЕСЛИ(ИЛИ(A1=2; A1=3; И(A1>1; НЕ(ЕЧЁТН(A1)); СУММПРОИЗВ(--(ОСТАТ(A1;СТРОКА(ДВССЫЛ("3:"&ЦЕЛОЕ(КОРЕНЬ(A1)))))<>0))=ЦЕЛОЕ(КОРЕНЬ(A1))-2))); "Простое"; "Составное")
Как она работает:
- Сначала проверяются числа 2 и 3 (они простые по определению).
- Для остальных чисел:
- Исключаются чётные числа (кроме 2) с помощью
ЕЧЁТН. - Функция
ОСТАТпроверяет делимость на все нечётные числа от 3 до квадратного корня исходного числа. СУММПРОИЗВсчитает количество делителей с остатком ≠ 0.
- Исключаются чётные числа (кроме 2) с помощью
⚠️ Внимание: Формула не работает для чисел меньше 2 и чисел с плавающей запятой. Чтобы избежать ошибок, добавьте внешнюю проверку:
=ЕСЛИ(ИЛИ(A1<2; A1<>ЦЕЛОЕ(A1)); "Некорректное число"; [основная_формула])
Метод 2: Формула массива для диапазона чисел (Excel 365 и 2019)
Для проверки целого столбца (например, A2:A100) в Excel 365 или 2019 используйте динамическую формулу массива:
=ЕСЛИОШИБКА(
ЕСЛИ(
(A2:A100<2) + (A2:A100<>ЦЕЛОЕ(A2:A100)); "Некорректно";
ЕСЛИ(
(A2:A100=2) + (A2:A100=3); "Простое";
ЕСЛИ(
ЕЧЁТН(A2:A100); "Составное";
ПУСТОТА(ФИЛЬТР(
СТРОКА(ДВССЫЛ("3:"&МАКС(ЦЕЛОЕ(КОРЕНЬ(A2:A100)))));
ОСТАТ(A2:A100; СТРОКА(ДВССЫЛ("3:"&МАКС(ЦЕЛОЕ(КОРЕНЬ(A2:A100))))))=0
)); "Простое"; "Составное"
)
)
); ""
)
Особенности метода:
- 🔹 Работает только в новых версиях Excel (с поддержкой динамических массивов).
- 🔹 Автоматически обрабатывает весь диапазон — не нужно протягивать формулу вниз.
- 🔹 Использует
ФИЛЬТРдля поиска делителей, что ускоряет вычисления. - 🔹 Возвращает пустую строку для пустых ячеек (благодаря
ЕСЛИОШИБКА).
Критическая деталь: Если в вашем диапазоне есть числа больше 10 000, замените МАКС(ЦЕЛОЕ(КОРЕНЬ(...))) на фиксированное значение (например, 100), иначе формула может тормозить.
Метод 3: Пользовательская функция на VBA (для больших чисел)
Если вам нужно проверять числа больше 1 000 000 или обрабатывать десятки тысяч строк, стандартные формулы будут работать слишком медленно. В этом случае поможет пользовательская функция на VBA:
1. Нажмите Alt + F11, чтобы открыть редактор VBA.
2. Вставьте новый модуль (Insert → Module) и добавьте этот код:
Function IsPrime(num As Variant) As String
If Not IsNumeric(num) Or num <> Int(num) Or num < 2 Then
IsPrime = "Некорректно"
Exit Function
End If
If num = 2 Then
IsPrime = "Простое"
Exit Function
End If
If num Mod 2 = 0 Then
IsPrime = "Составное"
Exit Function
End If
Dim i As Long, maxDivisor As Long
maxDivisor = Sqr(num)
For i = 3 To maxDivisor Step 2
If num Mod i = 0 Then
IsPrime = "Составное"
Exit Function
End If
Next i
IsPrime = "Простое"
End Function
3. Теперь в любой ячейке можно использовать функцию =IsPrime(A1).
Преимущества метода:
- 🔹 В 10-100 раз быстрее формул для больших чисел.
- 🔹 Обрабатывает до 2^53 (максимальное число в Excel).
- 🔹 Легко модифицировать (например, добавить проверку на палиндромы).
Как ускорить функцию для чисел > 10^6?
Замените цикл For на проверку делимости только на простые числа до √n. Для этого предварительно сгенерируйте список простых чисел (например, решетом Эратосфена) и сохраните их в массиве.
Метод 4: Power Query для массовой обработки
Power Query (доступен в Excel 2016+) идеален для обработки больших наборов данных. Например, если у вас список из 50 000 чисел, этот метод сэкономит часы работы:
1. Выделите ваш диапазон и перейдите на вкладку Данные → Из таблицы/диапазона.
2. В редакторе Power Query добавьте пользовательский столбец с формулой:
(number) =>
let
isPrime =
if number < 2 or number <> Number.Round(number) then "Некорректно"
else if number = 2 then "Простое"
else if Number.Mod(number, 2) = 0 then "Составное"
else
let
maxDivisor = Number.Round(Number.Sqrt(number)),
divisors = List.Numbers(3, (maxDivisor - 3)/2 + 1, 2),
hasDivisor = List.AnyTrue(List.Transform(divisors, (d) => Number.Mod(number, d) = 0))
in
if hasDivisor then "Составное" else "Простое"
in
isPrime
3. Нажмите Закрыть и загрузить — результат появится на новом листе.
Почему это лучше формул:
| Критерий | Формулы Excel | Power Query |
|---|---|---|
| Скорость обработки 10 000 чисел | ~30 секунд | ~2 секунды |
| Максимальное число | Ограничено длиной формулы | До 2^53 |
| Гибкость | Сложно модифицировать | Легко добавить новые проверки |
| Автоматизация | Нужно обновлять вручную | Обновляется при изменении данных |
Исключите пустые ячейки|Преобразуйте текстовые числа в числовой формат (=ЗНАЧЕН(A1))|Удалите дубликаты (если не нужны)|Отсортируйте данные по возрастанию (ускорит обработку)-->
Метод 5: Оптимизированный алгоритм (решето Эратосфена)
Если вам нужно найти все простые числа в диапазоне (например, от 1 до 10 000), используйте решето Эратосфена. Этот алгоритм в 10 раз эффективнее поиска делителей для каждого числа отдельно.
Создайте таблицу с числами от 2 до N (где N — ваше максимальное число). Затем:
- Выделите первую ячейку (число 2) как простое.
- Удалите все кратные этому числу (4, 6, 8,...).
- Повторите для следующего невычеркнутого числа (3, затем 5 и т.д.).
В Excel это реализуется через VBA или Power Query. Пример кода для VBA:
Sub SieveOfEratosthenes()
Dim n As Long, i As Long, j As Long
n = 10000 ' Максимальное число
Dim isPrime() As Boolean
ReDim isPrime(1 To n)
For i = 2 To n: isPrime(i) = True: Next i
For i = 2 To Sqr(n)
If isPrime(i) Then
For j = i * i To n Step i
isPrime(j) = False
Next j
End If
Next i
' Вывод результатов на лист
Dim outputRow As Long: outputRow = 1
For i = 2 To n
If isPrime(i) Then
Cells(outputRow, 1).Value = i
outputRow = outputRow + 1
End If
Next i
End Sub
⚠️ Внимание: Для N > 1 000 000 этот макрос может занять несколько минут. Чтобы ускорить работу:
- 🔹 Используйте
Application.ScreenUpdating = Falseв начале макроса. - 🔹 Записывайте результаты в массив, а не прямо на лист.
- 🔹 Для N > 10^7 рассмотрите варианты на Python или C++.
Типичные ошибки и как их избежать
Даже опытные пользователи Excel допускают ошибки при работе с простыми числами. Вот самые распространённые:
⚠️ Внимание: Формулы сОСТАТиКОРЕНЬмогут давать неверные результаты для чисел видаp^2(например, 49 = 7×7), если не учитывать целочисленное деление. Всегда проверяйте граничные случаи!
Ошибка 1: Пропуск числа 2
- 🔸 Многие формулы начинают проверку с 3, забывая, что 2 — единственное чётное простое число.
- 🔸 Решение: Всегда добавляйте отдельную проверку
=ЕСЛИ(A1=2; "Простое"; ...).
Ошибка 2: Неучёт нецелых чисел
- 🔸 Формулы вроде
ОСТАТ(A1; 3)вернут ошибку, если в ячейке текст или дробь. - 🔸 Решение: Используйте
ЕСЛИ(И(ЧИСЛО(A1); A1=ЦЕЛОЕ(A1)); ...).
Ошибка 3: Перебор всех делителей до N (вместо √N)
- 🔸 Проверка делимости до самого числа (а не до его корня) увеличивает время вычислений в 100+ раз.
- 🔸 Решение: Всегда используйте
ЦЕЛОЕ(КОРЕНЬ(A1))как верхнюю границу.
Ошибка 4: Игнорирование кэширования в VBA
- 🔸 Повторный расчёт простоты одного и того же числа в цикле замедляет макросы.
- 🔸 Решение: Сохраняйте результаты в словарь (
Scripting.Dictionary).
FAQ: Ответы на частые вопросы
Можно ли найти простые числа в Excel Online?
Да, но с ограничениями:
- 🔹 Методы 1 и 2 (формулы) работают полностью.
- 🔹 VBA (метод 3) и Power Query (метод 4) недоступны.
- 🔹 Для больших чисел используйте Google Sheets с
=ISPRIME(нужна установка надстройки).
Почему моя формула возвращает #ЧИСЛО! для числа 1 000 000?
Это ограничение Excel:
- 🔹 Стандартные формулы не оптимизированы для больших чисел.
- 🔹 Используйте VBA (метод 3) или разбивайте задачу на части (например, проверяйте диапазоны по 10 000 чисел).
- 🔹 Для чисел > 2^53 даже VBA не поможет — нужны специализированные программы (Wolfram Mathematica, Python).
Как найти ближайшее простое число к заданному?
Добавьте этот код в VBA:
Function NextPrime(num As Long) As Long
If num < 2 Then NextPrime = 2: Exit Function
Do
num = num + 1
If IsPrime(num) = "Простое" Then
NextPrime = num
Exit Function
End If
Loop
End Function
Аналогично пишется функция PrevPrime (уменьшайте num вместо увеличения).
Можно ли использовать эти методы для проверки чисел на простоту в Google Таблицах?
Да, но с поправками:
- 🔹 Замените
ДВССЫЛнаROW(INDIRECT(...)). - 🔹 В Google Apps Script (аналог VBA) используйте
Math.sqrt()вместоSQR. - 🔹 Для удобства установите надстройку "Prime Number Tools" из магазина надстроек.
Как визуализировать простые числа в Excel?
Создайте тепловую карту:
- Сгенерируйте таблицу чисел от 1 до N (например, 100×100).
- Добавьте столбец с проверкой простоты (любым из методов выше).
- Примените
Условное форматирование → Цветовые шкалы, где простые числа выделяются зелёным, а составные — красным.
Пример формулы для условного форматирования:
=$B1="Простое"
(где столбец B содержит результаты проверки).