Esse desafio é escrever um código rápido que possa executar uma soma infinita difícil computacionalmente.
Entrada
Uma matriz n
by com entradas inteiras menores que no valor absoluto. Ao testar, fico feliz em fornecer informações ao seu código em qualquer formato que ele deseje. O padrão será uma linha por linha da matriz, espaço separado e fornecido na entrada padrão.n
P
100
P
será definido positivamente, o que implica que será sempre simétrico. Fora isso, você realmente não precisa saber o que significa positivo definitivo para responder ao desafio. No entanto, isso significa que realmente haverá uma resposta para a soma definida abaixo.
No entanto, você precisa saber o que é um produto de vetor de matriz .
Saída
Seu código deve calcular a soma infinita:
para mais ou menos 0,0001 da resposta correta. Aqui Z
está o conjunto de números inteiros e Z^n
todos os vetores possíveis com n
elementos inteiros e e
é a famosa constante matemática que é aproximadamente igual a 2,71828. Observe que o valor no expoente é simplesmente um número. Veja abaixo um exemplo explícito.
Como isso se relaciona com a função Riemann Theta?
Na notação deste artigo sobre a aproximação da função Riemann Theta , estamos tentando calcular . Nosso problema é um caso especial por pelo menos duas razões.
- Definimos o parâmetro inicial chamado
z
no artigo vinculado como 0. - Criamos a matriz de
P
maneira que o tamanho mínimo de um valor próprio seja1
. (Veja abaixo como a matriz é criada.)
Exemplos
P = [[ 5., 2., 0., 0.],
[ 2., 5., 2., -2.],
[ 0., 2., 5., 0.],
[ 0., -2., 0., 5.]]
Output: 1.07551411208
Mais detalhadamente, vamos ver apenas um termo na soma deste P. Tomemos, por exemplo, apenas um termo na soma:
e x^T P x = 30
. Observe que isso e^(-30)
é sobre 10^(-14)
e, portanto, é improvável que seja importante para obter a resposta correta até a tolerância especificada. Lembre-se de que a soma infinita realmente usará todo vetor possível de comprimento 4 onde os elementos são inteiros. Eu apenas escolhi um para dar um exemplo explícito.
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
Ponto
Vou testar seu código em matrizes P escolhidas aleatoriamente de tamanho crescente.
Sua pontuação é simplesmente a maior n
para a qual eu recebo uma resposta correta em menos de 30 segundos quando a média é superior a 5 execuções com matrizes P
desse tamanho escolhidas aleatoriamente .
Que tal uma gravata?
Se houver empate, o vencedor será aquele cujo código executar mais rápido, em média, em 5 corridas. Caso esses horários também sejam iguais, o vencedor é a primeira resposta.
Como a entrada aleatória será criada?
- Seja M uma matriz aleatória de m por n com m <= n e entradas -1 ou 1. Em Python / numpy
M = np.random.choice([0,1], size = (m,n))*2-1
. Na prática, vou começarm
a discutirn/2
. - Seja P a matriz de identidade + M ^ T M. Em Python / numpy
P =np.identity(n)+np.dot(M.T,M)
. Agora temos a garantia de queP
é definitivo positivo e as entradas estão em um intervalo adequado.
Observe que isso significa que todos os autovalores de P são pelo menos 1, tornando o problema potencialmente mais fácil do que o problema geral de aproximação da função Riemann Theta.
Línguas e bibliotecas
Você pode usar qualquer idioma ou biblioteca que desejar. No entanto, para fins de pontuação, executarei seu código na minha máquina, portanto, forneça instruções claras sobre como executá-lo no Ubuntu.
Minha máquina Os horários serão executados na minha máquina. Esta é uma instalação padrão do Ubuntu em um processador de 8 GB AMD FX-8350 de oito núcleos. Isso também significa que eu preciso poder executar seu código.
Respostas principais
n = 47
em C ++ por Ton Hospeln = 8
em Python por Maltysen
x
de [-1,0,2,1]
. Você pode elaborar sobre isso? (Dica: Eu não sou um guru matemática)