Questa sfida è scrivere codice veloce che può eseguire una somma infinita computazionalmente difficile.
Ingresso
Un nby nmatrice Pcon le voci interi che sono più piccoli 100in 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.
Psarà 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 Zl'insieme degli interi e così anche Z^ntutti i possibili vettori con nelementi 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
znel documento collegato su 0. - Creiamo la matrice
Pin 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 nper il quale ottengo una risposta corretta in meno di 30 secondi quando viene calcolata la media su 5 esecuzioni con matrici scelte a caso Pdi 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òmper 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 = 47in C ++ di Ton Hospeln = 8in Python di Maltysen
xdi [-1,0,2,1]. Puoi approfondire questo? (Suggerimento: non sono un guru della matematica)

