# -*- coding: utf-8 -*-

import math

from eratosthenes import eratosthenes


def get_numbers_supremum(n):
    return math.floor(n * math.log(n) + n * math.log(math.log(n)))


def get_prime(n):
    # Для x >= 17 доказано следующее неравенство касательно функции распределения простых чисел - Pi(x):
    # x / ln(x) < Pi(x) < 1.25506 * x / ln(x), воспользуемся этим и сформируем диапозон чисел
    # для просеивания в решете Эратосфена достаточной длины, но в то же время без избыточности
    # (для получения более оптимального алгоритма).

    # Нам нужно решать обратную задачу: по известной Pi(x) найти супремум для x,
    # для него известна и доказана следующая верхняя грань (для n >= 6): x < n * ln(n) + n * ln(ln(n))

    # Таким образом, на выходе мы получим простые числа в количестве, гарантированно превышающем изначально заданное
    if n >= 6:
        primes = eratosthenes(get_numbers_supremum(n))
    else:
        # На 17 чисел приходится 6 простых, поэтому в решето пойдут лишь они
        primes = eratosthenes(17)

    return primes[n - 1]
