IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Vzaimno prostie chisla!!! (http://www.imho.ws/showthread.php?t=81546)

wk-cof 12.03.2005 19:16

Vzaimno prostie chisla!!!
 
Kak naiti chislo vzaimno prostih chisel s H<10^12 i kolichestvo delitelei H???

Lord Skill 18.03.2005 14:32

перебором

wk-cof 20.03.2005 13:03

издеваешься??? 10^12 степень - перебором ты ее до старости вселенной делать будешь... Алгоритмы какие - нить кто - нить знает???

moron 21.03.2005 12:10

ну составь один раз таблицу простых чисел <10**12
а в дальнейшем на ее основе строй алгоритмы

wk-cof 21.03.2005 13:37

Хм... Даже если на 1000 обычных чисел приходится 1 простое, то таблица будет содержать 10^12 / 1000 = 1000000000 миллион чисел. А алгоритма нахождения следующего простого числа еще никто не придумал. Есть решето Эратосфена и еще несколько методов, но все они основаны на последовательном исключении НЕ простых чисел.
А способ узнать число взаимнопростых я уже нашел - функция Эйлера.
С числом простых делителей сложнее...

Ghost 21.03.2005 13:56

Вложений: 1
Для начала, хочешь - не хочешь, придется разложить число H на простые множители. После этого задача сводится к следующему: найти количество чисел меньших H, неделящихся ни на один из этих множителей. Решение этой задачи можно найти в книге "Ф.А.Новиков ДИСКРЕТНАЯ МАТЕМАТИКА ДЛЯ ПРОГРАММИСТОВ" (см. аттач).

moron 21.03.2005 15:44

Для нахождения простых делителей H<10**12 достаточно иметь таблицу всех простых <10**6 (Это существенно, т.к. время работы возрастает экспоненциально, если мне не изменяет память!)
Программка на питоне за полчаса выдала мне все простые числа до 1000000. Надо? (Программку, список простых чисел.)
Далее, перебирая все делители меньшие корня квадратного из H, находишь все его простые делители (предварительно проверив, а не является ли H само по себе простым).
А дальше уточняешь задание.

Drakosha 21.03.2005 18:43

можеш уточнить насчет количетва делителей - что точно надо?

Hex0gen 21.03.2005 22:31

Вложений: 1
wk-cof:
Найти число чисел, взаимно простых с N при небольшом числе N - это достаточно простая задача.
Есть, так называемая, Функция Эйлера. Функция Эйлера от числа N численно равна числу чисел меньших N и взаимно простых с N.

Если известно разложение числа N на простые множители, то Функция Эйлера вычисляется за полиномиальное время.

Итак, тебе нужно:
1. Найти разложение числа N на простые множители! Алгоритмов масса (ро-эвристика Полларда, квадратичное решето). Но, поскольку число N - мало (~10^12), то для простоты можно обойтись простым перебором (надо совершить всего ~10^6 делений).

2. Пусть N = (p1^e1)*(p2^e2)*...*(pk^ek), где p1, p2, ... , pk - простые числа.
Число чисел меньших N и взаимно простых с N равно:
F(N) = (p1^e1 - p1^(e1-1))*(p2^e2 - p2^(e2-1))*..*(pk^ek - pk^(ek-1))

Я тут маленькую программку написал, которая вычисляет Функцию Эйлера, если хочешь, коды кину.

Алгоритм вычисления Функции Эйлера прикладываю (:

wk-cof 23.03.2005 10:19

to Hex0gen:
Спасибо, но я уже и сам это понял.

to moron:
А с простыми делителями - есть другой способ:Есть N<=10**12 сначала возьмем цифру 2. Если N на нее делится - делим его и проверяем снова, и так далее пока нацело оно на 2 делится уже не будет. берем следующую цифру, проверяем делимость. Смысл в том, что следующее число, на которое будет делиться N - простое. и так далее до N/2, или пока N не станет = 1. Махсимум(если число N - простое) нам прийдется сделат 10**6 - 1 операцию, а это для современной машины это не проблема.
Метод, показанный здесь имеет ту же основу, что и решето, но не требует создания огромного массива с простыми числами. :)


Часовой пояс GMT +4, время: 17:06.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.