Введение
Теория чисел полна чудес в виде неожиданных связей. Вот один из них.
Два целых числа является со-премьером , если они не имеют общие моменты, кроме 1. Дан число N , рассмотрят все целые числа от 1 до N . Нарисуйте два таких целых числа случайным образом (все целые числа имеют одинаковую вероятность быть выбранными при каждом розыгрыше; розыгрыши являются независимыми и с заменой). Пусть p обозначает вероятность того, что два выбранных целых числа взаимно просты. Тогда p стремится к 6 / π 2 ≈ 0,6079 ... как N стремится к бесконечности.
Соревнование
Цель этой задачи состоит в вычислении р как функция от N .
В качестве примера рассмотрим N = 4. Есть 16 возможных пар, полученных из целых чисел 1,2,3,4. 11 из этих пар взаимно просты, а именно (1,1), (1,2), (1,3), (1,4), (2,1), (3,1), (4,1 ), (2,3), (3,2), (3,4), (4,3). Таким образом, р = 11/16 = 0,6875 для N = 4.
Точное значение р должно быть вычислено по меньшей мере , четырех знаков после запятой. Это подразумевает, что вычисления должны быть детерминированными (в отличие от Монте-Карло). Но это не должно быть прямым перечислением всех пар, как указано выше; любой метод может быть использован.
Можно использовать аргументы функции или stdin / stdout. Если отображается вывод, конечные нули могут быть опущены. Так, например, 0.6300
может отображаться как 0.63
. Он должен отображаться в виде десятичного числа, а не в виде дроби (отображение строки 63/100
не допускается).
Критерий выигрыша - наименьшее количество байтов. Нет никаких ограничений на использование встроенных функций.
Контрольные примеры
Ввод / вывод (только четыре знака после запятой обязательны, как указано выше):
1 / 1.000000000000000
2 / 0.750000000000000
4 / 0.687500000000000
10 / 0.630000000000000
100 / 0.608700000000000
1000 / 0.608383000000000
источник
63/100
допустимый литерал, пригодный для вычислений. (Langs, о котором я говорю: Factor , Racket )Ответы:
Желе ,
128 байтПопробуйте онлайн!
Следующий двоичный код работает с этой версией интерпретатора Jelly .
идея
Ясно, что количество пар (j, k) , для которых j ≤ k, а j и k взаимно просты, равно числу пар (k, j), которые удовлетворяют тем же условиям. Также, если j = k , j = 1 = k .
Таким образом, чтобы подсчитать количество пар простых чисел с координатами от 1 до n , достаточно вычислить количество m пар (j, k), такое что j ≤ k , а затем вычислить 2m - 1 .
Наконец, так как общая функция Эйлера φ (k) дает целые числа между 1 и k , которые взаимно просты с k , мы можем вычислить m как φ (1) +… + φ (n) .
Код
источник
Mathematica
4342 байтаЯ нашел точки решетки, видимые из источника , из которого взята картинка ниже, чтобы помочь переосмыслить проблему с помощью следующих вопросов, касающихся данной квадратной области единичной решетки:
Примеры
Конечные нули опущены.
тайминг
Время в секундах предшествует ответу.
источник
Pyth -
1311 байтТестовый пакет .
источник
Mathematica,
4232 байтаАнонимная функция, использует простую грубую силу. Последний случай выполняется на моей машине примерно за .37 секунд. Объяснение:
источник
Count[Array[GCD,{#, #}],1,2]/#^2.&
будь моим гостем.Дьялог АПЛ, 15 байт
Довольно просто. Это монадический функциональный поезд. Йота - это числа от 1 до ввода, поэтому мы берем внешнее произведение по gcd, а затем подсчитываем пропорцию единиц.
источник
Октава,
4947 байтПросто подсчитать
gcd
все пары и посчитать .источник
kron
! Отличная идея!meshgrid
, но потом заметил, что могу сделать то же самое сkron
inline! (-> анонимная функция)JavaScript (ES6), 88 байт
объяснение
Тест
Требуется некоторое время для больших (
>100
) значенийn
.Показать фрагмент кода
источник
Серьезно, 15 байтов
Шестнадцатеричный дамп:
Попробуйте онлайн
Я не собираюсь объяснять это, поскольку он буквально использует тот же алгоритм, что и решение Денниса Желе (хотя я получил его независимо).
источник
J,
1917 байтИспользование:
Объяснение:
Решение Денниса дает хорошее объяснение, как мы можем использовать функцию totient.
Попробуйте это онлайн здесь.
источник
Mathematica, 35 байт
Реализует алгоритм @ Денниса.
Вычислите сумму коэффициента (фи-функцию Эйлера) в диапазоне от 1 до входного значения. Умножьте на число с плавающей запятой два (с точностью до четырех цифр) и вычтите одно. (Больше точности можно сохранить, используя вместо "
2
" и "1`4
".) Это общее количество пар взаимно простых чисел, поэтому разделите их на квадрат ввода, чтобы получить искомую дробь. Потому что два приблизительное число, так и результат.Тестирование (с данными о времени в левом столбце, так как по крайней мере один из нас считает это интересным), с функцией, назначенной
f
так, чтобы тестовая строка была легче читаемой.Редактировать: Показывать экстент диапазона входных данных (меняя точность на единицу вместо двух, потому что в противном случае результаты становятся довольно монотонными) и призывая других делать то же самое ...
RepeatedTiming[]
выполняет вычисления несколько раз и занимает среднее время, пытаясь игнорировать холодные кэши и другие эффекты, вызывающие выбросы времени. Асимптотический пределпоэтому для аргументов> 10 ^ 4 мы можем просто вернуть «0,6079» и соответствовать указанным требованиям к точности и точности.
источник
Юлия, 95 байт
Просто прямой подход на данный момент; Я рассмотрю более короткие / более элегантные решения в ближайшее время. Это анонимная функция, которая принимает целое число и возвращает число с плавающей точкой. Чтобы вызвать его, присвойте его переменной.
Ungolfed:
источник
collect
ленивый объект, чтобы взять егоlength
.length
не определен метод, как здесь для итератора отфильтрованных комбинаций. Точно так жеendof
не будет работать, потому что нет метода для этого типаgetindex
.range
не возвращает объект того же типа, что иcombinations
. Последний возвращает итератор для комбинаций, который является отдельным типом без определенногоlength
метода. Смотрите здесь . (Также:
синтаксис предпочтительнееrange
для построения диапазонов;))Sage, 55 байтов
Благодаря тому, что Sage вычисляет все символически, проблемы с эпсилонами и числами с плавающей запятой не возникают. Компромисс заключается в том, чтобы следовать правилу выходного формата, необходим дополнительный вызов
n()
(функция десятичной аппроксимации).Попробуйте онлайн
источник
MATL ,
2017 байтЭто использует текущая версия (5.0.0) языка.
Подход, основанный на ответе @ flawr .
Изменить (28 апреля 2015 г.) : попробуйте онлайн! После того, как этот ответ был опубликован, функция
Y)
была переименована вX:
; ссылка включает это изменение.пример
объяснение
Старый ответ: 20 байт
объяснение
источник
PARI / GP , 25 байтов
Создание анонимной функции сэкономило бы байт, но тогда мне пришлось бы использовать
self
его в целом , чтобы сделать его дороже.источник
фактор,
120113 байтовЯ провел урок игры в гольф, и я не могу получить его короче.
Перевод: Юлия .
Пример запускается на первых 5 тестовых примерах (значение 1000 заставляет его заморозить редактор, и я не могу быть обеспокоен компиляцией исполняемого файла прямо сейчас):
источник
Самау , 12 байт
Отказ от ответственности: не участвует, потому что я обновил язык после того, как вопрос был опубликован.
Шестнадцатеричный дамп (Samau использует кодировку CP737):
Используя тот же алгоритм, что и ответ Денниса в Jelly.
источник
Python2 / Pypy, 178 байт
x
Файл:Бег:
Код подсчитывает пары взаимно простых чисел
(n,m) for m<n
дважды (c+=2
). Это игнорирует,(i,i) for i=1..n
что в порядке, за исключением(1,1)
, таким образом, исправляется путем инициализации счетчика с1
(1.0
чтобы подготовиться к делению поплавка позже) для компенсации.источник