Questa sfida è scrivere codice veloce che può eseguire una somma infinita computazionalmente difficile.
Ingresso
Un n
by n
matrice P
con le voci interi che sono più piccoli 100
in valore assoluto. Durante il test sono felice di fornire input al tuo codice in qualsiasi formato ragionevole desiderato dal tuo codice. L'impostazione predefinita sarà una riga per riga della matrice, spazio separato e fornito sull'input standard.
P
sarà definito positivo che implica che sarà sempre simmetrico. A parte questo, non hai davvero bisogno di sapere cosa significhi positivo per rispondere alla sfida. Significa tuttavia che ci sarà effettivamente una risposta alla somma definita di seguito.
Tuttavia, è necessario sapere cos'è un prodotto a matrice vettoriale .
Produzione
Il tuo codice dovrebbe calcolare la somma infinita:
entro più o meno 0,0001 della risposta corretta. Ecco Z
l'insieme degli interi e così anche Z^n
tutti i possibili vettori con n
elementi interi ed e
è la famosa costante matematica che equivale approssimativamente a 2.71828. Si noti che il valore nell'esponente è semplicemente un numero. Vedi sotto per un esempio esplicito.
Come si collega alla funzione di Riemann Theta?
Nella notazione di questo documento sull'approssimazione della funzione di Riemann Theta stiamo cercando di calcolare . Il nostro problema è un caso speciale per almeno due motivi.
- Impostiamo il parametro iniziale chiamato
z
nel documento collegato su 0. - Creiamo la matrice
P
in modo tale che sia la dimensione minima di un autovalore1
. (Vedi sotto per come viene creata la matrice.)
Esempi
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
Più in dettaglio, vediamo un solo termine nella somma per questo P. Prendiamo ad esempio solo un termine nella somma:
e x^T P x = 30
. Si noti che e^(-30)
è circa 10^(-14)
e quindi è improbabile che sia importante per ottenere la risposta corretta fino alla tolleranza data. Ricordiamo che la somma infinita utilizzerà effettivamente ogni possibile vettore di lunghezza 4 in cui gli elementi sono numeri interi. Ne ho appena scelto uno per fare un esempio esplicito.
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
Punto
Proverò il tuo codice su matrici P scelte casualmente di dimensioni crescenti.
Il tuo punteggio è semplicemente il più grande n
per il quale ottengo una risposta corretta in meno di 30 secondi quando viene calcolata la media su 5 esecuzioni con matrici scelte a caso P
di quella dimensione.
Che ne dici di una cravatta?
In caso di pareggio, il vincitore sarà quello il cui codice viene eseguito in media più veloce su 5 punti. Nel caso in cui anche questi tempi siano uguali, il vincitore è la prima risposta.
Come verrà creato l'input casuale?
- Sia M una matrice m per n casuale con m <= n e voci che sono -1 o 1. In Python / numpy
M = np.random.choice([0,1], size = (m,n))*2-1
. In pratica mi metteròm
per circan/2
. - Sia P la matrice identità + M ^ T M. In Python / numpy
P =np.identity(n)+np.dot(M.T,M)
. Ora abbiamo la garanzia cheP
è definito positivo e le voci sono in un intervallo adatto.
Si noti che ciò significa che tutti gli autovalori di P sono almeno 1, rendendo il problema potenzialmente più semplice del problema generale di approssimazione della funzione di Riemann Theta.
Lingue e biblioteche
Puoi usare qualsiasi lingua o biblioteca che ti piace. Tuttavia, ai fini del calcolo del punteggio eseguirò il codice sul mio computer, quindi fornisci istruzioni chiare su come eseguirlo su Ubuntu.
La mia macchina I tempi verranno eseguiti sulla mia macchina. Questa è un'installazione Ubuntu standard su un processore a otto core AMD FX-8350 da 8 GB. Questo significa anche che devo essere in grado di eseguire il tuo codice.
Risposte principali
n = 47
in C ++ di Ton Hospeln = 8
in Python di Maltysen
x
di [-1,0,2,1]
. Puoi approfondire questo? (Suggerimento: non sono un guru della matematica)