Pi vezes e (ou Torta, se você gosta de notação ambígua) com 100 casas decimais é:
8.5397342226735670654635508695465744950348885357651149618796011301792286111573308075725638697104739439...
( OIES A019609 ) ( argumento para possível irracionalidade )
Sua tarefa é escrever um programa que receba um número inteiro positivo N e produza Pi * e truncado para N casas decimais. por exemplo, se N = 2, a saída deve ser 8.53
.
Esse é um problema de otimização, portanto a submissão que pode fornecer a saída correta para o valor mais alto de N será vencedora.
Para garantir que todos os envios sejam julgados usando o mesmo poder de computação, seu código deve ser executado em ideone , usando qualquer idioma compatível. De acordo com o ideone faq , existe um limite de tempo de execução de 5 segundos para usuários não conectados. Esse limite de 5 segundos é o que você deve usar, não o limite de 15 segundos para usuários conectados. (Consulte o FAQ para outros limites, como memória, tamanho do código etc.)
Especificamente, qualquer pessoa que não esteja logada no ideone deve poder executar seu programa no ideone para todos os valores de N de 1 a um máximo de Nmax e ver a saída correta quase o tempo todo . sem erros Time limit exceeded
ou Memory limit exceeded
etc. A finalização com o maior Nmax vence.
(Se o tempo real gasto é menor do que 5 segundos não importa, desde que a ideona não cometa erros. " Quase o tempo todo " é definido como mais de 95% do tempo para qualquer N. em particular)
Detalhes
- Você pode usar qualquer método matemático que desejar para calcular Pi * e, mas não pode codificar a saída além das primeiras dezenas de dígitos de Pi, e ou Pi * e .
- Seu programa deve poder trabalhar para qualquer N, com recursos ilimitados.
- Você pode usar constantes Pi ou e incorporadas se o seu idioma as possuir.
- Você não pode acessar sites ou recursos externos ao seu código (se alguém permitir isso).
- Além da codificação e do acesso a recursos externos, tudo o que a ideona permite é quase certo.
- Sua entrada e saída devem (obviamente) funcionar com o que a ideona fornecer para a E / S (stdin / stdout apenas parece). Tudo bem se você precisar de aspas na entrada N ou se a saída for algo como
ans = ...
etc. - Inclua um link para um trecho de código do seu código com o seu Nmax como entrada.
- Se houver um empate (provavelmente apenas se vários envios atingirem o limite de caracteres de saída de 64 kB), a resposta mais alta vence.
fonte
Respostas:
Python - 65535
http://ideone.com/knKRhn
O Ideone não parece ter sido
gmpy2
instalado, o que é lamentável por pelo menos dois motivos. Um, porque tornaria a calcuação muito mais rápida, e dois, porque torna impraticável qualquer fórmula que exija uma raiz quadrada de precisão arbitrária.A fórmula que eu uso para π foi listada por Ramanujan como Fórmula (39):
que converge à taxa de ~ 5,89 dígitos por termo. Que eu saiba, essa é a série convergente mais rápida do tipo que não requer a avaliação de uma raiz quadrada de precisão arbitrária. A fórmula (44) do mesmo artigo (taxa de convergência ~ 7,98 dígitos por termo) é mais frequentemente referida como a fórmula de Ramanujan.
A fórmula que eu uso para e é a soma dos fatoriais inversos. O número de termos requeridos é calculado como -1 ( 10 n ), usando uma aproximação que encontrei no excesso de matemática . O componente Lambert W 0 é encontrado usando o método de Newton.
O cálculo de cada um desses somatórios é feito através da Avaliação Rápida da Função E (mais conhecida como divisão binária), originalmente criada por Karatsuba. O método reduz um somatório para n termos a um único valor racional p / q . Esses dois valores são multiplicados para produzir o resultado final.
Atualização: a
criação de perfil revelou que mais da metade do tempo necessário para o cálculo foi gasto na divisão final. Somente os log ( 2 n ) bits mais altos de q são necessários para obter precisão total. O código agora preenche o buffer de saída Ideone em 3,33s .
Atualização 2:
Como esse é um desafio de otimização , decidi escrever minha própria rotina de divisão para combater a lentidão do CPython. A implementação
divnr
acima usa a Divisão Newton-Raphson . A idéia geral é calcular d = 1 / q · 2 n usando o Método de Newton, onde n é o número de bits que o resultado requer e calcula o resultado como p · d >> n . O tempo de execução agora é de 2,87s - e isso sem cortar os bits antes do cálculo; é desnecessário para este método.fonte
PARI / GP: 33000
Este é basicamente o programa fornecido no OEIS , modificado para receber e formatar a saída corretamente. Deve servir como uma linha de base a ser vencida, se nada mais.
I supor isso é preciso. Eu verifiquei em 100 e 20k contra o OEIS, e foi compatível com ambos. É muito difícil encontrar mais dígitos online para comparar.
Para 33.000, são necessários cerca de 4,5 segundos, portanto provavelmente poderia ser um pouco esbarrado. Eu apenas me cansei de mexer no input e no loop de submissão / compilação / execução do ideone.
Link para Ideone.com
fonte
Str(floor(frac(x)*10^m)
, vai centenas / milhares de vezes mais rápido.Python 3
Como os pi e e internos não têm dígitos suficientes, decidi calcular os meus.
Link IDEOne
Saída para STDIN = 1000:
fonte
should be able to work for any N, given unlimited resources
regra maior parte da produção é zeros em torno N = 10000..)NameError: name 'xrange' not defined
.Scala - 1790
IDEOne em http://ideone.com/A2CIto .
Usamos a fórmula de Wetherfield para π (e o código da fórmula de Machin é transportado a partir daqui ). Calculamos e usando a série de potências comuns.
fonte