A função Pi é uma extensão do fatorial sobre os reais (ou mesmo números complexos). Para números inteiros n , Π (n) = n! , mas para obter uma definição sobre os reais, definimos-a usando uma integral:
Neste desafio, vamos inverter a Π função.
Dado um número real z ≥ 1 , encontre x positivo de modo que Π (x) = z . Sua resposta deve ser precisa por pelo menos 5 dígitos decimais.
Exemplos:
120 -> 5.0000
10 -> 3.39008
3.14 -> 2.44815
2017 -> 6.53847
1.5 -> 1.66277
120 -> -0.991706
. Isso ocorre porque Π (x) vai para o infinito enquanto x vai para -1 a partir da direita. Talvez você queira insistir que x> 0 também.Respostas:
Mathematica,
171527 bytesSaída parece
{{x -> n}}
, onden
está a solução, que pode não ser permitida.fonte
Pitão, 4 bytes
Um programa que recebe a entrada de um número e imprime o resultado.
Suíte de teste
Como funciona
fonte
MATL , 13 bytes
Isso usa pesquisa linear nas etapas de
1e-5
início em1
. Por isso, é terrivelmente lento e atinge o tempo limite no compilador online.Para testá-lo, o link a seguir substitui o
1e-5
requisito de precisão por1e-2
. Experimente online!Explicação
fonte
GeoGebra , 25 bytes
Entrou na entrada do CAS e espera a entrada de um número na célula da planilha
A1
. Retorna uma matriz de um elemento do formulário{x = <result>}
.Aqui está um gif da execução:
Como funciona
N
umeralmenteSolve
a seguinte equação :,Gamma(x+1)=A1
com valor inicialx=1
.fonte
1.5
. Não consegui descobrir qual algoritmo o GeoGebra usa para resolver numéricos, mas o valor inicial dex=1
deu respostas puramente positivas para todos os valores que tentei.MATLAB, 59 bytes
Essa é uma função anônima que encontra o minimizador da diferença quadrada entre a função Pi e sua entrada, começando em
1
, com tolerância muito pequena (fornecida poreps
) para obter a precisão desejada.Casos de teste (executados no Matlab R2015b):
Você pode experimentá-lo on-line no Octave, mas infelizmente alguns dos resultados não têm a precisão necessária.
fonte
J,
8633 bytesUsa o método de Newton com o log Pi para evitar o estouro.
Esta é a versão anterior que calcula o registro Gamma usando a aproximação de Stirling. O tamanho da etapa (1e3) e o número de termos no log Gamma (3) podem ser aumentados para uma precisão possivelmente mais alta ao custo do desempenho.
Outra versão que calcula os termos do coeficiente em tempo real
Experimente online! e para ver os termos convergirem .
Explicação
fonte
Mathematica, 21 bytes
FindRoot
aplica o método de Newton internamente quando há um valor inicial.Os dois métodos abaixo aplicam o método de Newton diretamente.
Alternativa usando o FixedPoint 45 bytes
Uma implementação mais precisa do método de Newton para resolver isso, já que o Mathematica pode calcular a derivada diretamente, em vez de aproximar.
O uso de regras para substituir repetidamente seria mais curto, mas há um limite (65536) para quantas iterações podem ser executadas que podem ser atingidas, embora
FixedPoint
não tenham um limite.Alternativa usando regras, 38 bytes
fonte
Geléia , 34 bytes
Experimente online! ou Exibir os valores intermediários à medida que eles convergem .
Uma implementação da combinação de J do método de Newton e aproximação de derivada (método secante) para calcular o inverso de Π ( n ).
Ele resolve o inverso do log ( Π ( n )) para evitar o estouro.
Começa com um palpite inicial x 0 = y +1 onde y = log ( Π ( n )). Em seguida, itera até a convergência usando x n +1 = x n - (log ( Π ( x n )) - y ) / (log (( Π (1.001 * x n )) - log ( Π ( x n ))) / (0,001 * x n )).
fonte
1.5
PARI / GP, 30 bytes
Encontra solução entre
1
ex+1
. Infelizmente,x
não é grande o suficiente como limite superior para entrada como1.5
.fonte
Mathematica, 26 bytes
Mais uma solução Mathematica!
A solução de equações sempre pode ser transformada em um problema de minimização.
Encontra o argumento que minimiza a diferença entre os lados esquerdo e direito da equação.
O uso do NArgMin em vez do NMinimize força a saída a ser apenas o resultado desejado, em vez da saída detalhada baseada em regras, usual (e salva um byte!)
fonte
C com libm, 111
Atualização - corrigida para a entrada 1.5.
gamma(x+1)
é uma função monotonicamente crescente no intervalo em questão; ela é apenas uma pesquisa binária até que a diferença entre valores sucessivos seja pequena. O limite inferior inicial é0
e o limite superior inicial é2*x
.A entrada e a saída são feitas através de um ponteiro para uma passagem dupla para a função.
Tenho certeza de que isso pode ser jogado mais fundo - em particular, acho que não preciso de quatro duplas locais, mas até agora não estou vendo uma maneira fácil de reduzir isso.
Experimente online - Cria (vincula-se à libm) e roda em um script bash.
Ligeiramente não-destruído:
fonte