Задача о семи кёнигсбергских мостах — Википедия

Содержание [скрыть][показать]

Функция Эйлера

Определение

Функция Эйлера (иногда обозначаемая или ) — это количество чисел от до , взаимно простых с . Иными словами, это количество таких чисел в отрезке , наибольший общий делитель которых с равен единице.

Несколько первых значений этой функции (A000010 в энциклопедии OEIS):





Свойства

Три следующих простых свойства функции Эйлера — достаточны, чтобы научиться вычислять её для любых чисел:

  • Если — простое число, то .

    (Это очевидно, т.к.

    Путеводитель по Антананариву

    любое число, кроме самого , взаимно просто с ним.)

  • Если — простое, — натуральное число, то .

    (Поскольку с числом не взаимно просты только числа вида , которых штук.)

  • Если и взаимно простые, то («мультипликативность» функции Эйлера).

    (Этот факт следует из китайской теоремы об остатках.

    Рассмотрим произвольное число . Обозначим через и остатки от деления на и соответственно. Тогда взаимно просто с тогда и только тогда, когда взаимно просто с и с по отдельности, или, что то же самое, взаимно просто с и взаимно просто с . Применяя китайскую теорему об остатках, получаем, что любой паре чисел и взаимно однозначно соответствует число , что и завершает доказательство.)

Отсюда можно получить функцию Эйлера для любого через его факторизацию (разложение на простые сомножители):

если

(где все — простые), то



Реализация

Простейший код, вычисляющий функцию Эйлера, факторизуя число элементарным методом за :

int phi (int n){int result = n;for(int i=2; i*i<=n;++i)if(n % i ==0){while(n % i ==0) n /= i; result -= result / i;}if(n >1) result -= result / n;return result;}

Ключевое место для вычисление функции Эйлера — это нахождение факторизации числа .

Его можно осуществить за время, значительно меньшее : см. Эффективные алгоритмы факторизации.

Приложения функции Эйлера

Самое известное и важное свойство функции Эйлера выражается в теореме Эйлера:

где и взаимно просты.

В частном случае, когда простое, теорема Эйлера превращается в так называемую малую теорему Ферма:

Теорема Эйлера достаточно часто встречается в практических приложениях, например, см. Обратный элемент в поле по модулю.

Задачи в online judges

Список задач, в которых требуется посчитать функцию Эйлера,либо воспользоваться теоремой Эйлера, либо по значению функции Эйлера восстанавливать исходное число:

If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

Find the sum of all the multiples of 3 or 5 below 1000.

Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел — 23.

Найдите сумму всех чисел меньше 1000, кратных 3 или 5.

На всеми нами любимом инфостарте давно муссируется тема, мол как сделать так, чтобы трукодеры считали нас за людей. Собственно проблема состоит в том, что 1Сников не считают программистами. Тому есть две причины:

1. Порог вхождения в клан 1С-ников — низок. Точнее его нет, чтобы стать 1С-ником, не надо иметь соответствующего образования, уметь программировать. Достаточно пойти к клиенту и установить ему 1С, остальное с опытом придет. Все 1С-ники, даже с образованием, прошли этот путь новичка. Но хочу отметить, что эти люди 1С-ники, но не 1С-программисты. Но слова похожие и эти «новички» портят нам репутацию.

2.

Достопримечательности Антананариву

Мало кто из трукодеров представляет чем реально занимаются 1С-программисты. Проблема в том, что 1С-программист — на самом деле понятие более широкое, чем просто кодер. Как  правило 1С-программист не только кодер, но еще и: «архитектор БД», «бизнес аналитик», «менеджер проекта», «системный администратор»… . Трукодерам это непонятно, в других средах эти обязанности никогда не выполняются одним человеком, а нам еще и надо хорошо знать прикладную составляющую, а не только техническую сторону.

Так вот, в одной из веток форума, чувак с ником scientesнапомнил всем о существовании проекта Эйлер, и предложил решать задачи на платформе 1С, типа какая разница C++ или 1С, ну ниже производительность, но язык-то полноценный. Плюс задачи проекта подразумевают, что правильный код выполнится менее чем за 1 минуту.

Мне как программисту эта идея понравилась. Буду периодически решать попорядку задачки и выкладывать их решения в виде внешних обработок и кода.


Собственно первая мысль, решить в лоб перебором:

 

О проекте

Что такое Проект «Эйлер»?

Проект «Эйлер» — это набор интригующих задач по математике и программированию, для решения которых, однако, недостаточно одной только математической интуиции. Разумеется, математика поможет прийти к красивому и элегантному решению, но для успешного решения большинства задач без навыков программирования не обойтись.

Основная мотивация для создания и поддержки проекта — предоставить пытливым умам платформу для погружения в незнакомые области и добавить немного веселья в процесс изучения новых идей.

Для кого предназначены задачи?

Целевая аудитория проекта включает в себя студентов, которым мало университетского курса, не-математиков, которым, тем не менее, интересна математика, а также профессионалов, которым хотят быть в хорошей математической форме.

Значит, задачи может решить кто угодно?

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

С чего мне начать?

Это зависит от ваших навыков и способностей. В таблице «Задачи» можно посмотреть сколько человек уже решило каждую из них. В общем случае — чем больше людей решило задачу, тем она проще.

Я написал программу, теперь придётся ждать результата вычислений пару дней?

Разумеется, нет! Каждая задача подчиняется «правилу одной минуты», которое гласит: несмотря на то, что на построение алгоритма решения могут уйти часы, эффективная реализация позволяет получить ответ на компьютере средней вычислительной мощности меньше, чем за одну минуту.

А если моя программа проработала дольше минуты, решение не засчитывается?

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

Можно ли пользоваться поисковиком в процессе решения?

Многие задачи таят в себе настоящие математические сокровища, и использование интернета для их поиска никоим образом не возбраняется. Но существует чёткая граница между собственным исследованием и копипастой решения с другого сайта. Чему вы научитесь, списывая с решебника?

Я перепроверил свою программу десять раз, а ответ всё равно не принимается! Может, у вас там ошибка?

Мы постоянно выкладываем новые задачи, поэтому в самые свежие вполне могут закрасться мелкие ошибки, или же условие может быть сформулировано недостаточно чётко. Но согласитесь, что когда большинство попадает в цель, а один стрелок промахивается десять раз подряд, вряд ли ему придёт в голову стрелять себе в ногу и заключать, что раз оружие работает как нужно, то во всём виновата мишень.

Можете дать парочку советов по решению задач?

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

Я столько всего изучил, пока решал задачу ХХХ, можно мне публиковать своё решение?

На самом деле, ответ заключается в самом вопросе. Ничто не сравнится с удовлетворением от решения задачи, над которой вы ломали голову не один час. Конечно, желая поделиться своим озарением с другими, вы действуете из лучших побуждений, но увы, скорее всего вы оказывате своим читателям медвежью услугу. Настоящее обучение — это активный процесс, одно дело наблюдать за процессом, и совсем другое — переживать этот опыт самому. Пожалуйста, не лишайте других столь ценного удовольствия.

Кто это всё придумал?

Проект «Эйлер» был основан Colin Hughes (aka euler) в октябре 2001 как подраздел сайта mathschallenge.net.

Где находится Антананариву?

Кто бы мог подумать, что такие задачи окажутся настолько популярными? Поскольку количество пользователей продолжало неуклонно расти, Проект «Эйлер» переехал на отдельный домен в 2006 году.

Кто поддерживает работу Проекта «Эйлер»?

Идеи для новых задач приходят к нам от участников проекта.

Затем над ними работает команда трудолюбивых и талантливых математиков и программистов. Проще говоря, Проект живёт благодаря своим участникам.

Благодарности

За создание сайта — Виталию aka Vitalg.
За перевод задач — Элану aka Konnektor, Виталию aka Stumbler.
За адскость — Антону aka antox(z*)

 

 

© Проект Эйлера | Translated problems from ProjectEuler.net

Добавить комментарий

Закрыть меню