Поиск простоты: Алгоритмы поиска простых чисел / Хабр

Алгоритмы поиска простых чисел / Хабр

«Самое большое простое число 232582657-1. И я с гордостью утверждаю, что запомнил все его цифры… в двоичной форме».
Карл Померанс

Натуральное число называется простым, если оно имеет только два различных делителя: единицу и само себя. Задача поиска простых чисел не дает покоя математикам уже очень давно. Долгое время прямого практического применения эта проблема не имела, но все изменилось с появлением криптографии с открытым ключом. В этой заметке рассматривается несколько способов поиска простых чисел, как представляющих исключительно академический интерес, так и применяемых сегодня в криптографии.

Решето Эратосфена

Решето Эратосфена — алгоритм, предложенный древнегреческим математиком Эратосфеном. Этот метод позволяет найти все простые числа меньше заданного числа n. Суть метода заключается в следующем. Возьмем набор чисел от 2 до n. Вычеркнем из набора (отсеим) все числа делящиеся на 2, кроме 2. Перейдем к следующему «не отсеянному» числу — 3, снова вычеркиваем все что делится на 3. Переходим к следующему оставшемуся числу — 5 и так далее до тех пор пока мы не дойдем до n. После выполнения вышеописанных действий, в изначальном списке останутся только простые числа.

Алгоритм можно несколько оптимизировать. Так как один из делителей составного числа n обязательно , алгоритм можно останавливать, после вычеркивания чисел делящихся на .

Иллюстрация работы алгоритма из Википедии:


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

Существует ряд оптимизаций, позволяющих снизить эти показатели. Прием под названием wheel factorization состоит в том, чтобы включать в изначальный список только числа взаимно простые с несколькими первыми простыми числами (например меньше 30). В теории предлагается брать первые простые примерно до . Это позволяет снизить сложность алгоритма в раз. Помимо этого для уменьшения потребляемой памяти используется так называемое сегментирование. Изначальный набор чисел делится на сегменты размером и для каждого сегмента решето Эратосфена применяется по отдельности. Потребление памяти снижается до .

Решето Аткина


Более совершенный алгоритм отсеивания составных чисел был предложен Аткином и Берштайном и получил название Решето Аткина. Этот способ основан на следующих трех свойствах простых чисел.

Свойство 1

Если n — положительное число, не кратное квадрату простого числа и такое, что . То n — простое, тогда и только тогда, когда число корней уравнения нечетно.

Свойство 2

Если n — положительное число, не кратное квадрату простого числа и такое, что . То n — простое, тогда и только тогда, когда число корней уравнения нечетно.

Свойство 3

Если n — положительное число, не кратное квадрату простого числа и такое, что . То n — простое, тогда и только тогда, когда число корней уравнения нечетно.

Доказательства этих свойств приводятся в этой статье.

На начальном этапе алгоритма решето Аткина представляет собой массив A размером n, заполненный нулями. Для определения простых чисел перебираются все . Для каждой такой пары вычисляется , , и значение элементов массива , , увеличивается на единицу. В конце работы алгоритма индексы всех элементов массива, которые имеют нечетные значения либо простые числа, либо квадраты простого числа. На последнем шаге алгоритма производится вычеркивание квадратов оставшихся в наборе чисел.

Из описания алгоритма следует, что вычислительная сложность решета Аткина и потребление памяти составляют . При использовании wheel factorization и сегментирования оценка сложности алгоритма снижается до , а потребление памяти до .

Числа Мерсенна и тест Люка-Лемера


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

Один из таких методов проверки — тест Люка-Лемера. Это детерминированный и безусловный тест простоты. Это означает, что прохождение теста гарантирует простоту числа. К сожалению, тест предназначен только для чисел особого вида , где p — натуральное число. Такие числа называются числами Мерсенна.

Тест Люка-Лемера утверждает, что число Мерсенна простое тогда и только тогда, когда p — простое и делит нацело -й член последовательности задаваемой рекуррентно: для .

Для числа длиной p бит вычислительная сложность алгоритма составляет .

Благодаря простоте и детерминированности теста, самые большие известные простые числа — числа Мерсенна. Самое большое известное простое число на сегодня — , его десятичная запись состоит из 24,862,048 цифр. Полюбоваться на эту красоту можно здесь.

Теорема Ферма и тест Миллера-Рабина


Простых чисел Мерсенна известно не очень много, поэтому для криптографии с открытым ключом необходим другой способ поиска простых чисел. Одним из таким способов является тест простоты Ферма. Он основан на малой теореме Ферма, которая гласит, что если n — простое число, то для любого a, которое не делится на n, выполняется равенство . Доказательство теоремы можно найти на Википедии.

Тест простоты Ферма — вероятностный тест, который заключается в переборе нескольких значений a, если хотя бы для одного из них выполняется неравенство , то число n — составное. В противном случае, n — вероятно простое. Чем больше значений a использовано в тесте, тем выше вероятность того, что n — простое.

К сожалению, существуют такие составные числа n, для которых сравнение выполняется для всех a взаимно простых с n. Такие числа называются числам Кармайкла. Составные числа, которые успешно проходят тест Ферма, называются псевдопростыми Ферма. Количество псевдопростых Ферма бесконечно, поэтому тест Ферма — не самый надежный способ определения простых чисел.

Тест Миллера-Рабина

Более надежных результатов можно добиться комбинируя малую теорему Ферма и тот факт, что для простого числа p не существует других корней уравнения , кроме 1 и -1. Тест Миллера-Рабина перебирает несколько значений a и проверяет выполнение следующих условий.

Пусть p — простое число и , тогда для любого a справедливо хотя бы одно из условий:

  1. Существует целое число r < s такое, что


По теореме Ферма , а так как из свойства о корнях уравнения следует что если мы найдем такое a, для которого одно из условий не выполняется, значит p — составное число. Если одно из условий выполняется, число a называют свидетелем простоты числа n по Миллеру, а само число n — вероятно простым.

Чем больше свидетелей простоты найдено, тем выше вероятность того, что n — простое. Согласно теореме Рабина вероятность того, что случайно выбранное число a окажется свидетелем простоты составного числа составляет приблизительно .

Следовательно, если проверить k случайных чисел a, то вероятность принять составное число за простое .

Сложность работы алгоритма , где k — количество проверок.

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

Он смог сгенерировать такие составные числа, которые успершно прошли тест на простоту в библиотеках OpenSSL, CryptLib, JavaScript Big Number и многих других.

Тест Люка и Тест Baillie–PSW


Чтобы избежать уязвимости, связанные с ситуациями, когда сгенерированное злоумышленником составное число, выдается за простое, Мартин Альбрехт предлагает использовать тест Baillie–PSW. Несмотря на то, что тест Baillie–PSW является вероятностным, на сегодняшний день не найдено ни одно составное число, которое успешно проходит этот тест. За нахождение подобного числа в 1980 году авторы алгоритма пообещали вознаграждение в размере $30. Приз пока так и не был востребован.

Ряд исследователей проверили все числа до и не обнаружили ни одного составного числа, прошедшего тест Baillie–PSW. Поэтому, для чисел меньше тест считается детерминированным.

Суть теста сводится к последовательной проверке числа на простоу двумя различными методами. Один из этих методов уже описанный выше тест Миллера-Рабина. Второй — тест Люка на сильную псевдопростоту.

Тест Люка на сильную псевдопростоту

Последовательности Люка — пары рекуррентных последовательностей , описываемые выражениями:


Пусть и — последовательности Люка, где целые числа P и Q удовлетворяют условию

Вычислим символ Якоби: .

Найдем такие r, s для которых выполняется равенство

Для простого числа n выполняется одно из следующих условий:

  1. n делит
  2. n делит для некоторого j < r


В противном случае n — составное.

Вероятность того, что составное число n успешно пройдет тест Люка для заданной пары параметров P, Q не превышает 4/15. Следовательно, после применения теста k раз, эта вероятность составляет .

Тесты Миллера-Рабина и Люка производят не пересекающиеся множества псевдопростых чисел, соответственно если число p прошло оба теста, оно простое. Именно на этом свойстве основывается тест Baillie–PSW.

Заключение


В зависимости от поставленной задачи, могут использоваться различные методы поиска простых чисел. К примеру, при поиске больших простых чисел Мерсенна, сперва, при помощи решета Эратосфена или Аткина определяется список простых чисел до некоторой границы, предположим, до . Затем для каждого числа p из списка, с помощью теста Люка-Лемера, на простоту проверяется .

Чтобы сгенерировать большое простое число в криптографических целях, выбирается случайное число a и проверяется тестом Миллера-Рабина или более надежным Baillie–PSW. Согласно теореме о распределении простых чисел, у случайно выбранного числа от 1 до n шанс оказаться простым примерно равен . Следовательно, чтобы найти простое число размером 1024 бита, достаточно перебрать около тысячи вариантов.

P.S. Исходники


Реализацию всех описанных алгоритмов на Go можно посмотреть на GitHub.

Проверка простоты числа перебором делителей. Язык Python

Простые числа — это натуральные числа больше единицы, которые делятся нацело только на единицу и на себя. Например, число 3 простое, так как нацело делится только на 1 и 3. Число 4 сложное, так как нацело делится не только на 1 и 4, но также на число 2.

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

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

from math import sqrt
 
n = int(input())
 
prime = True
 
i = 2
while i <= sqrt(n):
    if n % i == 0:
        prime = False
        break
    i += 1
 
if prime:
    print("Простое число")
else:
    print("Составное число")

В программе мы сначала предполагаем, что введенное число n является простым, и поэтому присваиваем переменной prime значение True. Далее в цикле перебираются делители (переменная i ) от 2-х до квадратного корня из числа n. Как только встречается первый делитель, на который n делится без остатка, меняем значение prime на False и прерываем работу цикла, так как дальнейшее тестирование числа на простоту смысла не имеет.

Если после выполнения цикла prime осталась истиной, сработает ветка if условного оператора. В случае False, поток выполнения заходит в ветку else.

Если знать о такой особенности циклов в Python как возможность иметь ветку else, то код можно упростить, избавившись от переменной prime и ее проверки условным оператором после завершения работы цикла.

from math import sqrt
 
n = int(input())
 
i = 2
while i <= sqrt(n):
    if n % i == 0:
        print("Составное число")
        break
    i += 1
else:
    print("Простое число")

Ветка else при циклах (как while, так и for) срабатывает, если в основном теле цикла не происходило прерывания с помощью break. Если break сработал, то тело else выполняться не будет. При использовании таких конструкций также следует помнить, что если условие в заголовке цикла сразу возвращает ложь (то есть тело цикла не должно выполняться ни разу), код тела else все-равно будет выполнен.

Программы выше будут определять числа 0 и 1 как простые. Это неправильно. Данные числа не являются ни простыми, ни сложными. Для проверки ввода пользователя, можно воспользоваться условным оператором или зациклить запрос числа, пока не будет введено корректное значение:

n = 0
while n < 2:
    n = int(input())

Рассмотрим функцию, которая определяет, является ли число простым:

from math import sqrt
 
 
def is_prime(n):
    i = 2
    while i <= sqrt(n):
        if n % i == 0:
            return False
        i += 1
    if n > 1:
        return True
 
 
a = int(input())
 
if is_prime(a):
    print("Простое число")
else:
    print("Число НЕ является простым")

Здесь нет необходимости в прерывании работы цикла с помощью break, так как оператор return выполняет выход из тела всей функции.

Если цикл полностью отработал, выполнится выражение return True, находящееся ниже цикла. Оно помещено в тело условного оператора, чтобы исключить возврат «истины», когда в функцию передаются числа 0 или 1. В этом случае функция вернет объект None.

Программа не защищена от ввода отрицательного числа. При этом будет генерироваться ошибка на этапе извлечения квадратного корня.

Нарисуем блок-схему тестирования числа на простоту (без дополнительных проверок и оператора break):

from math import sqrt
 
n = int(input())
 
prime = True
 
i = 2
while i <= sqrt(n) and prime is True:
    if n % i == 0:
        prime = False
    i += 1
 
if prime:
    print("Простое число")
else:
    print("Составное число")

Больше задач в PDF

5 советов, которые следует помнить при поиске простоты

5 советов, которые следует помнить при поиске простоты

Изменения в нашей жизни могут быть трудными, особенно если мы не знаем, как и с чего начать. Прочтите этот пост, чтобы найти 5 советов, которые следует помнить в поисках простоты . Они помогут вам внести изменения, которые будут реалистичными, устойчивыми и эффективными для вас.

НАЙДИТЕ СВОЙ ПУТЬ К ПРОСТОТЕ

Этот пост не о практических способах упростить себе жизнь . Речь идет о некоторых других моментах, которые, я думаю, стоит иметь в виду, когда вы вносите эти изменения.

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

Как сказал Стив Джобс «Простое может быть сложнее, чем сложное: вам нужно много работать, чтобы очистить свое мышление, чтобы сделать его простым. Но в конце концов это того стоит, потому что, попав туда, вы сможете свернуть горы».

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

Итак, вот 5 советов, которые следует помнить в поисках простоты . Помните о них, когда вносите изменения, и они могут помочь вам немного облегчить переход к более простой жизни.

Прежде всего…

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

5 СОВЕТОВ, КОТОРЫЕ ОБЯЗАТЕЛЬНО ЗАПОМНИТЬ В ПОИСКАХ ПРОСТОТЫ
1. Не пытайтесь изменить все сразу

Если вы прочитали некоторые из мои другие посты о простой жизни , вы знаете, что есть много разных способов найти простоту в повседневной жизни.

Хотя все они помогут, не думайте, что вам нужно менять все сразу. Переворачивать свою жизнь с ног на голову — не лучший способ облегчить ее. Все, что он будет делать, это ошеломлять, напрягать вас и отвлекать от продолжения.

Вносите одно или два изменения за раз. Дайте им время осознать и изменить ситуацию. Только после этого переходите к следующему изменению.

2. Не обязательно быть первым

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

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

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

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

3. Определите приоритеты ваших изменений

Я не уверен, что вы читали историю о том, как я упростил свою жизнь. Если нет, то вы можете прочитать здесь . Упрощение моей жизни было важно для меня, потому что я устал совмещать работу и семью. Я изо всех сил пытался быть «всем для всех людей», и что-то нужно было изменить.

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

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

  • Если у вас долги и финансовые трудности, это может быть вашим первым шагом .
  • Возможно, вы всегда в пути, но все еще не успеваете. Тайм-менеджмент может стать вашим лучшим другом.
  • Возможно, у вас проблемы с психическим здоровьем или низкая самооценка. Сделайте заботу о себе приоритетом.

Разным людям в разное время нужны разные вещи. Определите, что вам нужно прямо сейчас, и сделайте шаги, чтобы помочь себе с этим прямо сейчас в качестве приоритета. Другие изменения могут подождать…

4. Будьте реалистичны в своих ожиданиях

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

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

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

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

5. Двигайтесь дальше, если что-то не работает

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

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

То, что что-то не работает для вас сегодня, не означает, что это не сработает для вас завтра.

ПОДЕЛИТЕСЬ СВОИМИ МЫСЛЯМИ

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

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

Найдите свой собственный путь, узнайте, что работает для вас, делайте больше и, самое главное, будьте проще.

Напишите мне по адресу [email protected], если у вас есть мысли, отзывы или идеи, которыми вы можете поделиться.

ДОПОЛНИТЕЛЬНАЯ ЛИТЕРАТУРА

Вот несколько постов, которые я выбрал, чтобы помочь вам, если вы ищете простоты…

  • 20 способов упростить вашу жизнь
  • Преимущества расхламления и очистки ваших вещей
  • Как обрести простоту в жизни
  • Как быть менее занятым
  • Прогресс, а не совершенство Вайскопф

    top

    Search for Simplicity — Weisskopf
    Ресурсы

    Колонка в Американском журнале физики.

    В поисках простоты
    Вайскопф, Виктор Ф.
    Колонка в Американском журнале
    Физика
    .
    декабрь 1984 г. — февраль 1986 г. (или больше?).

    «Я намереваюсь в этих эссе представить простые объяснения
    природа и величина важных свойств материи. Акцент
    будет, насколько это возможно, на простоте и физической проницательности. Один
    из главных целей состоит в том, чтобы показать, как наше понимание явлений
    основан на нескольких простых следствиях квантовой механики. Этот
    понимание позволит нам выразить некоторые из соответствующих
    количества, встречающиеся в природе, приблизительно в пересчете на простые
    комбинации следующих фундаментальных констант:

    Newton’s gravitational constant G
    The mass of the proton M
    The mass of the electron m
    The electric charge unit e
    Планковский квант действия h
    Скорость света0174

    В этих эссе я буду иметь дело с такими величинами, как размер и
    энергия атомов, энергия связи атомов в молекулах и твердых телах,
    плотность и твердость твердых тел, электропроводность металлов,
    тепловое расширение твердых тел, высота гор на Земле,
    яркость солнца и другие подобные величины».
    [Вайскопф, цитируется в Ridgen, v52n12]

    Столбцы:

    • 1984 Декабрь (v52n12) p1073 — » От редакции: Вайскопф «В поисках простоты »
      Введение редактора Джона С. Ригдена в колонку Вайскопфа.
    • 1985 Январь (v53n1) p19-20 — » В поисках простоты »
      «Мы начнем с простой задачи, которая еще не включает
      квантовая механика. Он измеряет размер молекул. […] Наш
      метод максимально близок к непосредственному восприятию нашими чувствами».
      Исправления в vn [??]
    • 1985 Февраль (v53n2) p109-110 — » Квантовая механика и принцип Паули »
    • 1985 MAR (V53N3) P206-207 — « Квантовая механика атома водорода »
    • 1985 APR (V53N4) P304305 — « ATOMS с несколькими электронами »
    • 1985 MAYS (v53n5). — Молекулярная связь »
    • 1985 Jun (V53N6) P522-523 -« Химическая энергия »
    • 1985 JUL (V53N7) P618-619 -» Размер молекул. 1985 Sep (v53n9) p814-815 — « Энергия сцепления твердых тел »
    • 1985 Oct (v53n10) p940-942 — » The metallic bond »
    • 1985 Dec (v53n12) p1140-1141 — » Thermal expansion »
    • 1986 Jan (v54n1) p1314 — » Максвелл, Рэлей и гора Эверест »
    • 1986 февраль (v54n2) p110-111 — » Горы, волны и дырявые потолки »

    Во введении редактора к предстоящей колонке Ригден пишет:

    .
    «[…] на протяжении 1950-х […] курс квантовой механики
    данный Джулианом Швингером в Гарвардском университете, был известен. […]
    Все присутствующие знали, что наблюдают за виртуозным
    в действии […].
    Курс Швингера был формальным и математически элегантным. Это было
    вызов монументальных масштабов для студента, поступающего в
    тему впервые.

    Массачусетскому технологическому институту для человека, идущего быстрым шагом, 20 лет.
    минут вниз по Массачусетс-авеню от Гарварда. Виктор Вайскопф
    преподавал квантовую механику в Массачусетском технологическом институте в 50-х годах, и студенты
    часто дополняют курс Швингера опытом сидения в
    у Вайскопфа. Курс Вики по необходимости был математическим, но
    в этом была простая естественность — это была квантовая механика в
    простые слова.

    Вайскопф научился у Эренфеста подходу к сложным математическим
    формализмов физики с долей скептицизма. «Эренфест», говорит
    Вайскопф, «показал мне, как добраться до настоящей физики, как
    различать физику и формализм, как докопаться до сути вещей Он говорил: «Физика проста, но тонка». […]

    […] Ханс Бете […] описывает некоторые из своих работ о
    предмет квантовой механики […] «Я не знаю другого места»,
    пишет Бете, «где сущностная прочность нашего мира, управляемого
    квантовой теорией лучше объясняется, или великое богатство
    явлений, обусловленных количественными различиями, проявляется с большей
    любовь.» «[Ригден, v52n12, p1073]

    «Один из его коллег говорил о нем как о обладателе Копенгагенской
    дух, нильсборовская способность так тщательно понимать
    сложную научную проблему, что он смог достичь просветляющей
    простота в представлении или обсуждении со всеми нами».