Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Проект Эйлера Задача 245

Автор вопроса: CommunityОтветов: 6

Сейчас я занимаюсь проблемой 245, но столкнулся с некоторыми проблемами. Я уже проделал над этим некоторую работу, но не чувствую, что сделал какие-то реальные шаги к ее решению. Вот что у меня есть:

Нам нужно найти n=ab с положительными целыми числами a и b. Мы также можем считать gcd(a, b) = 1 без ограничения общности и, таким образом, phi(n) = phi(ab) = phi(a)phi(b).

Мы пытаемся решить:

Следовательно:

В этот момент я подумал, что было бы неплохо увидеть, как эти числа были распределены. Я собрал программу грубой силы, которую использовал для поиска всех (составных) решений до 104:

15, 85, 255, 259, 391, 589, 1111, 3193, 4171, 4369, 12361, 17473, 21845, 25429, 28243, 47989, 52537, 65535, 65641, 68377, 83767, 91759

Главное, как там выглядит не будет слишком много меньше 1011 ограничения, указанного в задаче. Самое интересное/полезное, что я обнаружил, заключалось в том, что k было довольно мало даже для больших значений n. На самом деле самое большое k было всего 138. (Кроме того, кажется, что k всегда четно.)

Учитывая это, я предполагаю, что можно рассмотреть каждое значение k и найти, какое значение (значения) n может быть с этим значением k.

Возвращаясь к исходному уравнению, обратите внимание, что его можно переписать как:

Поскольку мы знаем к:

И это все, что у меня есть; Я все еще преследую некоторые из своих маршрутов, но мне интересно, не упускаю ли я смысл! С помощью грубой силы я нашел сумму до 108, что составляет 5699973227 (всего 237 решений для n).

У меня почти закончились идеи; может кто подскажет?


Обновление: много людей проделали большую работу, и вместе мы смогли доказать несколько вещей. Вот список:

n всегда нечетно, а k всегда четно. k ‹= 105,5. n не должно быть квадратным.

Я нашел все решения, когда n=pq (2 простых множителя) с p>q. Я использовал тот факт, что для двух простых чисел q = k+factor(k^2-k+1) и p = k+[k^2-k+1]/factor(k^2-k+1). Мы также знаем для 2 простых чисел k ‹ q ‹ 2k.

Для n с двумя или более простыми делителями все простые числа n больше k.

  • Эта проблема Эйлера сбивает с толку, если вы не знаете терминов; они лучше определены в # 243: projecteuler.net/index.php?section=problems&id= 243. Glenn 17.05.2009
  • Вся необходимая информация содержится в ссылке, которую я разместил. Вопрос звучит буквально: найдите сумму всех целых чисел 1‹n‹=10^11, для которых [n-φ(n)]/[n-1] = 1/k для некоторого целого числа k. 17.05.2009
  • Мне удалось немного выяснить: k должно делить n-1 (получите это из манипулирования вашим самым первым уравнением, чтобы в целочисленном числе был член вроде (n-1)/k). выражение), k не (обязательно) делит phi(n) (контрпримеры в вашем списке грубой силы), и n должно быть нечетным (следовательно, k четным) (легко показать, что (k- 1)n = k phi(n) - 1, рассмотрите это выражение по модулю 2 и запомните/докажите, что phi(n) всегда четно при n > 2). Я не вижу, куда идти дальше, и это все время, которое у меня сейчас есть. kquinn 18.05.2009
  • Я не думаю, что обсуждение переполнения стека соответствует духу проекта Эйлера;) leif 18.05.2009
  • Спасибо kquinn. Вы правы насчет k, делящего n-1. Это означало бы, что n = jk+1 = ab для некоторого j. Мне нужно выйти, но я пойду за остальными позже. Спасибо! 18.05.2009
  • kquinn, второе уравнение должно быть: (k-1)(n-1) = k(phi(n)-1) я думаю. Для n › 2 phi(n) четно (mod 2) (k-1)(n-1) = k → n(k-1) = 1. Чтобы это было правдой, n должно быть нечетным, а k четное. 18.05.2009

pythonalgorithmmath

Ответы

Ответ 1 · рейтинг 3 · Community

Умножьте простые числа. Что я сделал, так это сначала проверил каждый продукт с двумя простыми числами; сохранить те, которые являются успехами. Затем, используя сохраненные продукты, проверьте те, у которых больше простых чисел (каждый продукт с тремя простыми числами, показанный в вашем переборе, имеет подмножество из двух простых чисел, которое работает). Используйте эти сохраненные продукты и повторите попытку с 4 простыми числами, 5 простыми числами и т. д.

Единственным недостатком является то, что вам нужно хорошее сито или список простых чисел.

Вот список для N‹=(10^7):

2 простых числа 15,85,259,391,589,1111,3193,4171,4369,12361,17473,25429,28243,47989,52537,65641, 68377,83767,91759,100777,12370892,1263019,1860897,1840897,1840019 , 286357,291919,316171,327316171,327937, 346063353029 360301,404797,40301,404797406867 524851 531721 558513 563767 633727 705667773 8607 910489 970141 10135394218423869, 1233823,12618 07,1264693,1455889,1487371,1529641,1574383,1612381,1617379,1657531,1793689,20163 79,2095087,2130871,2214031,2299459,2500681,2553709,2609689,2617963,2763697,30475 21,3146677,3397651 , 3514603,3539017,3820909,3961219,4078927,4186993,4197901,44997 07,4552411,4935883,4975687,5103841,5299351,5729257,5829877,5864581,6017299,62364 01,6802531,6856609,8759011,9059233,9203377,9301603 ,9305311,9526747,9536899,95832 79,9782347,9900217 3 простых числа 255,21845,335923,3817309 4 простых числа 65535 5 простых чисел 83623935

Ответ 2 · рейтинг 9 · Dmitri Farkov

Project Euler не любит обсуждать проблемы на публичных форумах, таких как StackOverflow. Все задачи сделаны для самостоятельного выполнения, если вы столкнетесь с проблемами, вы можете попросить помощи для конкретной математической или программной концепции, но вы не можете просто решить спросить, как решить стоящую задачу - лишает смысла проект Эйлер.

Суть в том, чтобы учиться и придумывать решения самостоятельно, а также изучать новые концепции.

Ответ 3 · рейтинг 5 · Accipitridae

Позвольте мне продолжить то, что начал кувшин, но попробуйте несколько иной подход. Цель снова состоит в том, чтобы просто найти числа, которые имеют два разных множителя n=pq. Как вы уже заметили, мы ищем такие числа, что n-phi(n) делит n-1. То есть, если n=pq, то это означает, что мы ищем такие p,q, что

  p+q-1 divides pq-1

Предположим, что мы фиксируем p и ищем все простые числа q, удовлетворяющие приведенному выше уравнению. Приведенное выше уравнение не выглядит очень простым для решения, поэтому следующим шагом будет максимально возможное устранение q. В частности, мы используем, что если a делит b, то a также делит b + ka для любого целого k. Следовательно

  p+q-1 divides pq - 1 - p(p+q-1)

а его упрощение приводит к условию

  p+q-1 divides p^2 - p + 1.

Можно предположить, что p - меньший простой множитель числа n. Тогда p меньше квадратного корня из 1011. Следовательно, можно найти все числа с двумя множителями путем перебора всех простых чисел p, меньших квадратного корня из 1011, затем найти делители p^2-p+1, найти q и проверить если q простое число и pq является решением задачи.

Это, конечно, по-прежнему оставляет целые числа с более чем двумя простыми множителями. Здесь тоже работает несколько похожий подход, но он более сложен и требует дальнейшей оптимизации.

Один вопрос, на который я не могу ответить, заключается в том, почему эта проблема сформулирована так сложно. Разве авторы не могли просто запросить сумму составных целых чисел, где n-phi(n) делит n-1. Так что, возможно, мне не хватает большого намека.


Теперь, когда известны решения с двумя простыми множителями, я попытаюсь найти потенциальный алгоритм для поиска решений с более чем двумя простыми множителями. Цель состоит в том, чтобы найти алгоритм, который по заданному составному целому числу m находит все простые числа q, такие что mq является решением. т. е. q должно быть таким, чтобы

  mq - phi(mq) divides mq - 1.

Позволять

  F = mq - phi(mq).

Тогда конечно

  F = (m-phi(m)) q + phi(m).

Как и в случае двух простых множителей, можно найти условие для F, исключив q из левой части приведенного выше уравнения. Поскольку F делит mq-1, оно также делит

  (m-phi(m))(mq - 1)

и, следовательно, также

  m F - (m-phi(m))(mq - 1)  = m phi(m) + m - phi(m).

Таким образом, найдя все делители F числа m phi(m) + m - phi(m) и проверив, является ли (F - phi(m))/(m - phi(m)) простым, можно найти все решения mq для данного m. Поскольку только те дивизоры F, которые удовлетворяют

 F == phi(m) (mod m - phi(m))

может привести к новым решениям, этот факт иногда можно использовать для оптимизации факторизации m phi(m) + m - phi(m).

Ответ 4 · рейтинг 1 · Community

Чтобы не отдавать слишком много, я бы предложил две вещи:

  1. Проанализируйте последовательность чисел, которую вы произвели методом грубой силы: все они имеют общую характеристику. Если вы обнаружите, что это такое, у вас может быть шанс найти решение методом грубой силы.

  2. Найдите более сложный алгоритм факторинга. Или еще лучше: вместо того, чтобы находить множители по числам, строить числа по множителям...


РЕДАКТИРОВАТЬ: Образцы, которые вы найдете, только добавят к вашему пониманию и, надеюсь, покажут вам, как вы могли бы достичь такого же объема знаний путем адекватного манипулирования аналитическим выражением. Боюсь, не зная этой закономерности, пути к решению нет. Кроме того, это, вероятно, одна из самых сложных задач Project Euler, поэтому вам не нужно беспокоиться о том, чтобы найти решение без большого труда и пота...

Ответ 5 · рейтинг 1 · Community

прямой помощи в решении этой задачи нет, но может быть интересно для будущих математических проектов: вместо использования WolframAlpha для анализа последовательности я бы рекомендовал "Интерактивная энциклопедия целочисленных последовательностей" на сайте research.att.com.

Получайте удовольствие, решая все задачи Эйлера!

Ответ 6 · kgiannakakis

Я не нашел полного решения, но я хотел бы поделиться своими мыслями. Возможно, кто-то мог бы помочь.

Я считаю, что нужно попытаться свести проблему к


(источник: texify.com)

сложность. Для повышения эффективности поиска можно использовать следующие факты:

  • Любое решение должно быть нечетным числом
  • Любое решение должно быть кратно различным простым числам (множители квадратных чисел не допускаются)

Другие указывали на это, и их легко доказать, используя только основные свойства функции totient.

Я начну с анализа всех простых и составных чисел до sqrt(10^11). Это несложная задача, и требуемое время должно быть значительно меньше требуемой 1 минуты. Все решения выше квадратного корня имеют вид:

a*b, where at least one of a,b < sqrt(10^11)

При повторении диапазона 0..sqrt(10^11) я буду искать кратные числа в итерации, которые являются решениями. Я расскажу только о случае умножения числа меньше квадратного корня на одно простое число. Набор решений, который я получу таким образом, будет надмножеством набора решений с двумя простыми факторами. Это все равно не будет полным набором решений, так как не будут найдены решения вида p1p2p3, где p1p2,p2p3,p1p3›sqrt(10^11).

Пусть b - число меньше квадратного корня, а a - простое число для его умножения.


(источник: texify.com)

У нас есть:


(источник: texify.com)

На основании фактов, что

phi(a) = a - 1 and phi(a)*phi(b) = phi(a*b) if a, b coprime

у нас есть


(источник: texify.com)

Часть "по модулю" справа может быть записана как:


(источник: texify.com)

Позвольте мне временно принять это


(источник: texify.com)

Тогда я мог бы решить приведенное выше уравнение для a (m = 1), проверить, что результат является простым, и тогда у меня будет единственное решение, кратное b. Если m не находится в пределах, чтобы быть фактическим по модулю, тогда мне нужно либо решить уравнение для разных значений k:


(источник: texify.com)

(значения k должны быть как-то ограничены) или доказать, что в этом случае будет более высокое значение b ‹ sqrt(10^11), чтобы покрыть это.

Существует особый случай для b простого или b составного и mb = 0. В этом случае:


(источник: texify.com)

Это можно рассчитать. Для b простое число:


(источник: texify.com)

Мне нужно найти простое число a, удовлетворяющее уравнению:


(источник: texify.com)

Например, пусть b=3, phi(b)=2.

Мне нужно решить:

k[3a-2(a-1)] - 6 = 1 => k(a + 2) = 5

Для k = 1, a = 7, простое число (решение) Для всех других значений k приведенное выше уравнение не может быть выполнено.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы