Ce défi consiste à écrire du code rapide qui peut effectuer une somme infinie difficile à calculer.
Contribution
Une matrice n
par avec des entrées entières plus petites qu'en valeur absolue. Lors des tests, je suis heureux de fournir une entrée à votre code dans n'importe quel format raisonnable que votre code veut. La valeur par défaut sera une ligne par ligne de la matrice, séparée par des espaces et fournie sur l'entrée standard.n
P
100
P
sera défini positif ce qui implique qu'il sera toujours symétrique. En dehors de cela, vous n'avez pas vraiment besoin de savoir ce que signifie définitivement positif pour relever le défi. Cela signifie cependant qu'il y aura effectivement une réponse à la somme définie ci-dessous.
Vous devez cependant savoir ce qu'est un produit matrice-vecteur .
Sortie
Votre code doit calculer la somme infinie:
à plus ou moins 0,0001 de la bonne réponse. Voici Z
l'ensemble des entiers, ainsi que Z^n
tous les vecteurs possibles avec n
des éléments entiers et e
est la célèbre constante mathématique qui est approximativement égale à 2,71828. Notez que la valeur de l'exposant est simplement un nombre. Voir ci-dessous pour un exemple explicite.
Quel est le lien avec la fonction Riemann Theta?
Dans la notation de cet article sur l' approximation de la fonction Riemann Theta, nous essayons de calculer . Notre problème est un cas particulier pour au moins deux raisons.
- Nous mettons le paramètre initial appelé
z
dans le papier lié à 0. - Nous créons la matrice
P
de telle sorte que la taille minimale d'une valeur propre soit1
. (Voir ci-dessous pour savoir comment la matrice est créée.)
Exemples
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
Plus en détail, voyons un seul terme dans la somme pour ce P. Prenons par exemple un seul terme dans la somme:
et x^T P x = 30
. Notez que cela e^(-30)
est sur le point 10^(-14)
et qu'il est donc peu probable qu'il soit important pour obtenir la bonne réponse jusqu'à la tolérance donnée. Rappelons que la somme infinie utilisera en fait tous les vecteurs possibles de longueur 4 où les éléments sont des entiers. Je viens d'en choisir un pour donner un exemple explicite.
P = [[ 5., 2., 2., 2.],
[ 2., 5., 4., 4.],
[ 2., 4., 5., 4.],
[ 2., 4., 4., 5.]]
Output = 1.91841190706
P = [[ 6., -3., 3., -3., 3.],
[-3., 6., -5., 5., -5.],
[ 3., -5., 6., -5., 5.],
[-3., 5., -5., 6., -5.],
[ 3., -5., 5., -5., 6.]]
Output = 2.87091065342
P = [[6., -1., -3., 1., 3., -1., -3., 1., 3.],
[-1., 6., -1., -5., 1., 5., -1., -5., 1.],
[-3., -1., 6., 1., -5., -1., 5., 1., -5.],
[1., -5., 1., 6., -1., -5., 1., 5., -1.],
[3., 1., -5., -1., 6., 1., -5., -1., 5.],
[-1., 5., -1., -5., 1., 6., -1., -5., 1.],
[-3., -1., 5., 1., -5., -1., 6., 1., -5.],
[1., -5., 1., 5., -1., -5., 1., 6., -1.],
[3., 1., -5., -1., 5., 1., -5., -1., 6.]]
Output: 8.1443647932
P = [[ 7., 2., 0., 0., 6., 2., 0., 0., 6.],
[ 2., 7., 0., 0., 2., 6., 0., 0., 2.],
[ 0., 0., 7., -2., 0., 0., 6., -2., 0.],
[ 0., 0., -2., 7., 0., 0., -2., 6., 0.],
[ 6., 2., 0., 0., 7., 2., 0., 0., 6.],
[ 2., 6., 0., 0., 2., 7., 0., 0., 2.],
[ 0., 0., 6., -2., 0., 0., 7., -2., 0.],
[ 0., 0., -2., 6., 0., 0., -2., 7., 0.],
[ 6., 2., 0., 0., 6., 2., 0., 0., 7.]]
Output = 3.80639191181
But
Je vais tester votre code sur des matrices P choisies au hasard de taille croissante.
Votre score est simplement le plus élevé n
pour lequel j'obtiens une réponse correcte en moins de 30 secondes lorsqu'il est calculé en moyenne sur 5 courses avec des matrices choisies au hasard P
de cette taille.
Et une cravate?
En cas d'égalité, le vainqueur sera celui dont le code s'exécute le plus rapidement en moyenne sur 5 runs. Dans le cas où ces temps sont également égaux, le gagnant est la première réponse.
Comment sera créée l'entrée aléatoire?
- Soit M une matrice aléatoire m par n avec m <= n et des entrées qui sont -1 ou 1. En Python / numpy
M = np.random.choice([0,1], size = (m,n))*2-1
. En pratique, je vaism
être sur le pointn/2
. - Soit P la matrice d'identité + M ^ T M. En Python / numpy
P =np.identity(n)+np.dot(M.T,M)
. Nous sommes maintenant garantis queP
c'est définitif positif et les entrées sont dans une plage appropriée.
Notez que cela signifie que toutes les valeurs propres de P sont au moins 1, ce qui rend le problème potentiellement plus facile que le problème général d'approximation de la fonction de Riemann Theta.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue ou bibliothèque que vous aimez. Cependant, à des fins de notation, je vais exécuter votre code sur ma machine, veuillez donc fournir des instructions claires sur la façon de l'exécuter sur Ubuntu.
Ma machine Les horaires seront exécutés sur ma machine. Il s'agit d'une installation standard d'Ubuntu sur un processeur à huit cœurs AMD FX-8350 de 8 Go. Cela signifie également que je dois pouvoir exécuter votre code.
Réponses principales
n = 47
en C ++ par Ton Hospeln = 8
en Python par Maltysen
la source
x
de[-1,0,2,1]
. Pouvez-vous élaborer sur ce sujet? (Indice: je ne suis pas un gourou des mathématiques)Réponses:
C ++
Plus d'approche naïve. Évaluez uniquement l'intérieur de l'ellipsoïde.
Utilise les bibliothèques armadillo, ntl, gsl et pthread. Installer en utilisant
Compilez le programme en utilisant quelque chose comme:
Sur certains systèmes, vous devrez peut-être ajouter
-lgslcblas
après-lgsl
.Exécutez avec la taille de la matrice suivie des éléments sur STDIN:
matrix.txt
:Ou pour essayer une précision de 1e-5:
infinity.cpp
:la source
-lgslcblas
drapeau pour compiler. Une réponse incroyable au fait!Python 3
12 secondes n = 8 sur mon ordinateur, ubuntu 4 core.
Vraiment naïf, je n'ai aucune idée de ce que je fais.
Cela continuera d'augmenter la gamme de
Z
ce qu'il utilise jusqu'à ce qu'il obtienne une réponse suffisamment bonne. J'ai écrit ma propre multiplication matricielle, prolly devrait utiliser numpy.la source