Готовы ли вы окунуться в увлекательный мир простых чисел в Dart? Простые числа на протяжении веков интриговали математиков и программистов, и в этой статье мы рассмотрим различные методы генерации простых чисел, используя разговорный язык и примеры кода. Так что пристегните ремни и приготовьтесь к незабываемым приключениям!
Метод 1: подход грубой силы
Давайте начнем с самого простого метода: подхода грубой силы. Мы можем перебирать каждое число, начиная с 2, и проверять, делится ли оно на какое-либо число, меньшее самого себя. Если оно не делится ни на какое число, то это простое число.
bool isPrime(int number) {
if (number < 2) return false;
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
Метод 2: Решето Эратосфена
Решето Эратосфена — это эффективный алгоритм для поиска всех простых чисел до заданного предела. Он работает путем итеративной маркировки кратных каждого простого числа, начиная с 2, и исключения составных чисел.
List<int> sieveOfEratosthenes(int limit) {
List<bool> isPrime = List<bool>.filled(limit + 1, true);
List<int> primes = [];
for (int p = 2; p * p <= limit; p++) {
if (isPrime[p] == true) {
for (int i = p * p; i <= limit; i += p) {
isPrime[i] = false;
}
}
}
for (int p = 2; p <= limit; p++) {
if (isPrime[p]) {
primes.add(p);
}
}
return primes;
}
Метод 3: тест на простоту Миллера-Рабина
Тест на простоту Миллера-Рабина — это вероятностный алгоритм, который может определить, является ли данное число простым или составным. Хотя иногда это может приводить к ложным срабатываниям, это мощный инструмент для проверки простоты больших чисел.
bool millerRabinTest(int number, int k) {
if (number <= 1 || number == 4) return false;
if (number <= 3) return true;
int r = 0;
int d = number - 1;
while (d % 2 == 0) {
d ~/= 2;
r++;
}
for (int i = 0; i < k; i++) {
int a = 2 + Random().nextInt(number - 4);
int x = BigInt.from(a).modPow(BigInt.from(d), BigInt.from(number)).toInt();
if (x == 1 || x == number - 1) continue;
for (int j = 0; j < r - 1; j++) {
x = BigInt.from(x).modPow(BigInt.from(2), BigInt.from(number)).toInt();
if (x == number - 1) {
break;
}
if (x == 1) {
return false;
}
}
if (x != number - 1) {
return false;
}
}
return true;
}
Метод 4: тест на простоту AKS
Тест на простоту AKS — это детерминированный алгоритм, позволяющий определить, является ли число простым или составным. Он основан на теории полиномов и известен своим элегантным математическим доказательством.
bool aksPrimalityTest(int number) {
if (number <= 1) return false;
for (int i = 2; i * i <= number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
В заключение мы исследовали четыре различных метода генерации простых чисел в Dart: метод грубой силы, решето Эратосфена, тест на простоту Миллера-Рабина и тест на простоту AKS. Каждый метод имеет свои преимущества и недостатки, а выбор метода зависит от конкретных требований вашей программы.
Так что приступайте к экспериментам с простыми числами в Dart и раскройте мощь этих удивительных математических объектов в своем коде!
Простые числа занимают особое место в математике и программировании. В этой статье блога мы отправимся в увлекательное путешествие в мир простых чисел в Dart. Мы рассмотрим несколько методов и предоставим разговорные объяснения и примеры кода, которые помогут вам легко понять и генерировать простые числа. Итак, давайте углубимся и раскроем секреты генерации простых чисел!
Метод 1: подход грубой силы
Давайте начнем с самого простого метода: метода грубой силы. Мы начинаем с перебора каждого числа, начиная с 2, и проверяем, делится ли оно на любое число, меньшее самого себя. Если оно не делится ни на какое число, то это простое число.
bool isPrime(int number) {
if (number < 2) return false;
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
Метод 2: Решето Эратосфена
Решето Эратосфена — популярный алгоритм для нахождения всех простых чисел до заданного предела. Он работает путем итеративной маркировки кратных каждого простого числа, начиная с 2, и исключения составных чисел.
List<int> sieveOfEratosthenes(int limit) {
List<bool> isPrime = List<bool>.filled(limit + 1, true);
List<int> primes = [];
for (int p = 2; p * p <= limit; p++) {
if (isPrime[p] == true) {
for (int i = p * p; i <= limit; i += p) {
isPrime[i] = false;
}
}
}
for (int p = 2; p <= limit; p++) {
if (isPrime[p]) {
primes.add(p);
}
}
return primes;
}
Метод 3: тест на простоту Миллера-Рабина
Тест Миллера-Рабина на простоту – это вероятностный алгоритм, позволяющий быстро определить, является ли число простым или составным. Хотя иногда это может приводить к ложным срабатываниям, это особенно полезно для проверки простоты больших чисел.
bool millerRabinTest(int number, int k) {
if (number <= 1 || number == 4) return false;
if (number <= 3) return true;
int r = 0;
int d = number - 1;
while (d % 2 == 0) {
d ~/= 2;
r++;
}
for (int i = 0; i < k; i++) {
int a = 2 + Random().nextInt(number - 4);
int x = BigInt.from(a).modPow(BigInt.from(d), BigInt.from(number)).toInt();
if (x == 1 || x == number - 1) continue;
for (int j = 0; j < r - 1; j++) {
x = BigInt.from(x).modPow(BigInt.from(2), BigInt.from(number)).toInt();
if (x == number - 1) {
break;
}
if (x == 1) {
return false;
}
}
if (x != number - 1) {
return false;
}
}
return true;
}
Метод 4: тест на простоту AKS
Тест на простоту AKS – это детерминированный алгоритм, позволяющий определить, является ли число простым или составным. Он основан на теории полиномов и известен своим элегантным математическим доказательством.
bool aksPrimalityTest(int number) {
if (number <= 1) return false;
for (int i = 2; i * i <= number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
В этой статье мы рассмотрели четыре метода генерации простых чисел в Dart. Подход грубой силы, решето Эратосфена, тест на простоту Миллера-Рабина и тест на простоту AKS предлагают уникальные преимущества в зависимости от ваших конкретных требований. Включив эти методы в свои программы Dart, вы сможете раскрыть возможности простых чисел и улучшить свой код.