introduction
La théorie des nombres regorge de merveilles, sous la forme de connexions inattendues. En voici un.
Deux entiers sont co-prime si elles ne présentent aucun facteur en commun autre que 1. Étant donné un nombre N , considérer tous les entiers de 1 à N . Dessinez deux de ces entiers au hasard (tous les entiers ont la même probabilité d'être sélectionnés à chaque tirage; les tirages sont indépendants et avec remplacement). Soit p la probabilité que les deux entiers sélectionnés soient co-premiers. Alors p tend vers 6 / π 2 ≈ 0,6079 ... comme N tend vers l'infini.
Le défi
Le but de ce défi est de calculer p en fonction de N .
Par exemple, considérons N = 4. Il y a 16 paires possibles obtenues à partir des entiers 1,2,3,4. 11 de ces paires sont co-principales, à savoir (1,1), (1,2), (1,3), (1,4), (2,1), (3,1), (4,1 ), (2,3), (3,2), (3,4), (4,3). Ainsi p est 11/16 = 0,6875 pour N = 4.
La valeur exacte de p doit être calculée avec au moins quatre décimales. Cela implique que le calcul doit être déterministe (par opposition à Monte Carlo). Mais il n'est pas nécessaire que ce soit une énumération directe de toutes les paires comme ci-dessus; n'importe quelle méthode peut être utilisée.
Des arguments de fonction ou stdin / stdout peuvent être utilisés. Si vous affichez la sortie, les zéros de fin peuvent être omis. Ainsi, par exemple, 0.6300
peut être affiché comme 0.63
. Il doit être affiché sous la forme d'un nombre décimal et non sous forme d'une fraction (l'affichage de la chaîne 63/100
n'est pas autorisé).
Le critère de gain est le moins d'octets. Il n'y a aucune restriction sur l'utilisation des fonctions intégrées.
Cas de test
Entrée / sortie (seules quatre décimales sont obligatoires, comme indiqué ci-dessus):
1 / 1.000000000000000
2 / 0.750000000000000
4 / 0.687500000000000
10 / 0.630000000000000
100 / 0.608700000000000
1000 / 0.608383000000000
la source
63/100
est un littéral valide, utilisable en calcul. (Langs dont je parle: Factor , Racket )Réponses:
Gelée ,
128 octetsEssayez-le en ligne!
Le code binaire suivant fonctionne avec cette version de l'interpréteur Jelly .
Idée
Il est clair que le nombre de paires (j, k) telles que j ≤ k et j et k sont co-premiers est égal au nombre de paires (k, j) qui remplissent les mêmes conditions. De plus, si j = k , j = 1 = k .
Ainsi, pour compter le nombre de paires co-amorcées avec des coordonnées comprises entre 1 et n , il suffit de calculer le nombre m de paires (j, k) telles que j ≤ k , puis de calculer 2m - 1 .
Enfin, puisque la fonction de totaux d'Euler φ (k) donne le nombre entier compris entre 1 et k qui sont co-premiers à k , nous pouvons calculer m comme φ (1) +… + φ (n) .
Code
la source
Mathematica
4342 octetsJ'ai trouvé des points de réseau visibles depuis l'origine , à partir desquels la photo ci-dessous est prise, pour aider à recadrer le problème à travers les questions suivantes concernant une région carrée donnée du réseau unitaire:
Exemples
Les zéros de fin sont omis.
Timing
Le timing, en secondes, précède la réponse.
la source
Pyth -
1311 octetsSuite de tests .
la source
Mathematica,
4232 octetsFonction anonyme, utilise une force brute simple. Le dernier cas fonctionne en environ 0,37 seconde sur ma machine. Explication:
la source
Count[Array[GCD,{#, #}],1,2]/#^2.&
Soyez mon invité.Dyalog APL, 15 octets
Assez simple. C'est un train de fonction monadique. Iota est le nombre de 1 à l'entrée, nous prenons donc le produit extérieur par pgcd, puis comptons la proportion de ceux-ci.
la source
Octave,
4947 octetsIl suffit de calculer la
gcd
de toutes les paires et de compter.la source
kron
! Bonne idée!meshgrid
, mais j'ai remarqué que je pouvais faire la même chose enkron
ligne! (-> fonction anonyme)JavaScript (ES6), 88 octets
Explication
Tester
Prend un certain temps pour les grandes
>100
valeurs ( ) den
.Afficher l'extrait de code
la source
Sérieusement, 15 octets
Vidage hexadécimal:
Essayez-le en ligne
Je ne vais pas m'embêter à l'expliquer car il utilise littéralement exactement le même algorithme que la solution Jelly de Dennis (bien que je l'ait dérivé indépendamment).
la source
J,
1917 octetsUsage:
Explication:
La solution de Dennis donne une belle explication sur la façon d'utiliser la fonction de totient.
Essayez-le en ligne ici.
la source
Mathematica, 35 octets
Implémente l'algorithme de @ Dennis.
Calculez la somme du total (fonction phi d'Euler) sur la plage de 1 à la valeur d'entrée. Multipliez par virgule flottante deux (avec quatre chiffres de précision) et soustrayez un. (Plus de précision peut être conservée en utilisant à la place "
2
" et "1`4
".) Il s'agit du nombre total de paires de coprimes, donc divisez par le carré de l'entrée pour obtenir la fraction souhaitée. Parce que les deux sont un nombre approximatif, le résultat l'est également.Test (avec les données de chronométrage dans la colonne de gauche car au moins l'un d'entre nous pense que c'est intéressant), avec la fonction assignée à
f
pour que la ligne de test soit plus facile à lire .:Edit: montrant l'étendue de la plage des entrées (permutant la précision à l'une au lieu des deux car sinon les résultats deviennent plutôt monotones) et incitant les autres à faire de même ...
RepeatedTiming[]
effectue le calcul plusieurs fois et prend une moyenne des temps, essayant d'ignorer les caches froides et autres effets provoquant des valeurs aberrantes de synchronisation. La limite asymptotique estainsi, pour des arguments> 10 ^ 4, nous pouvons simplement renvoyer "0,6079" et répondre aux exigences de précision et d'exactitude spécifiées.
la source
Julia, 95 octets
Juste l'approche simple pour l'instant; J'examinerai bientôt des solutions plus courtes / plus élégantes. Il s'agit d'une fonction anonyme qui accepte un entier et renvoie un flottant. Pour l'appeler, affectez-le à une variable.
Non golfé:
la source
collect
un objet paresseux pour le prendrelength
.length
aucune méthode n'est définie, ce qui est le cas ici pour l'itérateur de combinaisons filtrées. De mêmeendof
ne fonctionnerait pas car il n'y a pas de méthode pour ce typegetindex
.range
ne retourne pas le même type d'objet quecombinations
. Ce dernier retourne un itérateur sur les combinaisons qui est un type séparé sanslength
méthode définie . Voyez ici . (De plus, la:
syntaxe est préféréerange
à la construction de plages;))Sauge, 55 octets
Grâce à Sage qui calcule tout symboliquement, les problèmes de machine epsilon et de virgule flottante ne surviennent pas. Le compromis est, afin de suivre la règle de format de sortie, un appel supplémentaire à
n()
(la fonction d'approximation décimale) est nécessaire.Essayez-le en ligne
la source
MATL ,
2017 octetsCela utilise la version actuelle (5.0.0) de la langue.
Approche basée sur la réponse de @ flawr .
Edit (28 avril 2015) : Essayez-le en ligne! Une fois cette réponse publiée, la fonction a
Y)
été renomméeX:
; le lien inclut ce changement.Exemple
Explication
Ancienne réponse: 20 octets
Explication
la source
PARI / GP , 25 octets
Rendre la fonction anonyme économiserait un octet, mais je devrais alors l'utiliser pour la
self
rendre plus chère dans l'ensemble.la source
Facteur,
120113 octetsJ'ai passé des cours à jouer au golf et je ne peux pas le raccourcir.
Traduction de: Julia .
L'exemple s'exécute sur les 5 premiers cas de test (une valeur de 1000 provoque le gel de l'éditeur, et je ne peux pas être dérangé pour compiler un exécutable pour le moment):
la source
Samau , 12 octets
Avis de non-responsabilité: Pas en compétition car j'ai mis à jour la langue après la publication de la question.
Vidage hexadécimal (Samau utilise le codage CP737):
En utilisant le même algorithme que la réponse de Dennis dans Jelly.
la source
Python2 / Pypy, 178 octets
Le
x
dossier:Fonctionnement:
Le code compte deux
(n,m) for m<n
fois les paires co-amorces (c+=2
). Ceci ignore(i,i) for i=1..n
ce qui est correct à l'exception de(1,1)
, étant ainsi corrigé en initialisant le compteur avec1
(1.0
pour préparer la division flottante plus tard) pour compenser.la source