Функция подсчета простых чисел demoted определяется как число простых чисел, меньших или равных .
Мы можем определить решение проблемы из следующим образом:
Учитывая два числа и , записанные в двоичном виде, решить, если .
Мы с другом говорили об этой проблеме ранее сегодня. Для этой задачи есть алгоритм псевдополиномиального времени - просто посчитайте до , используя пробное деление на каждом шаге, чтобы увидеть, сколько чисел простое, и проверьте, равно ли оно . Проблема также в PSPACE, так как алгоритм, который я только что описал, может быть реализован для использования только полиномиального вспомогательного пространства.
Однако у меня возникают проблемы с поиском способа поместить эту проблему в класс более низкой сложности. Я не могу понять, как построить верификатор полиномиального времени для проблемы, поэтому я не уверен, есть ли он в NP, и я вообще не могу придумать, как включить его в иерархию полиномов.
Какой класс сложности наиболее подходит для этой проблемы?
Благодарность!
источник
Ответы:
Это очень открытая проблема. Я нарисую некоторые классы, в которые проблема может «естественно» вписаться.
Ваше определение несколько неловко, с проблемой трудно вписаться в любой существующий класс сложности. Определенный вами язык является пересечением языков и { ( x , n ) | π ( x ) ≥ n } . Так, если, например, был в классе то был бы в{(x,n)|π(x)≤n} {(x,n)|π(x)≥n} {(x,n)|π(x)≤n} K {(x,n)|π(x)≥n} coK , Это затрудняет определение характеристики языка, который вы определили, потому что нужно указать «пересечение языка в с языком в », чтобы дать самую узкую границу.K coK
Проблема «Вычислить » - это проблема в , где - это класс задач вида «Вычислить число принимающих путей недетерминированной полиномиальной ТМ». Ясно, что мы можем построить недетерминированный TM, который угадывает число , и затем (с AKS) проверяет, является ли простым.π(X) #P #P⊆FPSPACE q≤x q
Вариант решения - , это класс языков, имеющих вид: «При наличии недетерминированного полинома TM, по крайней мере, половина путей вычисления принимает?». И и , вероятно, сводятся к проблеме в (выполняя некоторые фальсификация вышеупомянутой ТМ, чтобы сбалансировать количество принимающих путей).#P PP {(x,n)|π(x)≤n} {(x,n)|π(x)≥n} PP
источник
Ваша проблема в C = P= С помощью алгоритма,
m
и немногоb
x < m
затем отклонитьb=1
тогда:m < n
потом прими еще, отвергниm
простое, то примите еще отклонить,
В частности, ваша проблема также в PP, так как PP закрыт при сокращениях истинности таблицы .
источник
На практике вы можете получить ответ быстрее или медленнее :-(
Существуют достаточно хорошие приближения для π (x). Таким образом, вы вычисляете такое приближение, и если оно слишком далеко, вы знаете, что π (x) ≠ n. Например, если n ≥ x, то я знаю, что π (x) ≠ n, ничего не вычисляя.
Существует быстрый алгоритм, который определяет, является ли π (x) четным или нечетным, работает в O (x ^ (1/2)). Вы можете запустить этот алгоритм, и он может обнаружить, что четность n неверна, и все готово. Он имеет пятьдесят шансов, если n - случайное целое число, близкое к π (x).
Кроме этого, я не знаю ни одного метода, который быстрее, чем вычисление π (x). Что очень неудобно - если я пишу программу, которая должна вычислять π (10 ^ 25), и я получаю результат, который явно не ошибочен, то нет способа проверить, что мой результат верен, кроме повторения расчет. И вы не можете просто повторить вычисления, используя мою программу, вам нужно написать другую программу, иначе вы не обнаружите, есть ли в моей программе ошибки, из-за которых она вычисляет слегка отличную функцию от π (x).
π (x) может быть вычислено достаточно легко примерно за O (n ^ (2/3)) и быстрее с некоторыми действительно глубокими математическими вычислениями.
источник