Todos vocês conhecem o método Newton para aproximar as raízes de uma função, não sabem? Meu objetivo nesta tarefa é apresentar um aspecto interessante desse algoritmo.
O algoritmo de Newton converge apenas para certos, mas acima de tudo, valores complexos de entrada. Se você imagina a convergência do método para todos os valores de entrada sobre o plano complexo, geralmente obtém um belo fractal como este:
Especificações
O objetivo desta tarefa é gerar esses fractais. Isso significa que você obtém um polinômio como entrada e precisa imprimir o fractal correspondente como uma imagem em um formato de sua escolha como saída.
Entrada
A entrada é uma lista separada por espaços em branco de números complexos. Eles são escritos para baixo no estilo <Real part><iImaginary part>
, como este número: 5.32i3.05
. Você pode supor que o número de entrada não tenha mais que 4 casas decimais e seja menor que 1000. O primeiro deles não deve ser zero. Por exemplo, isso pode ser uma entrada para o seu programa:
1 -2i7,5 23.0004i-3,8 i12 0 5,1233i0,1
Os números são interpretados como os coeficientes de um polinômio, começando com a maior potência. Durante o resto desta especificação, o polinómio de entrada é designado P . A entrada acima é igual a este polinômio:
f (x) = x 5 + (-2 + 7,5 i ) x 4 + (23.0004 - 3,8 i ) x 3 + 12 i x 2 + 5,1233 + 0,1 i
A entrada pode vir para você a partir do stdin, de um argumento passado para o programa ou de um prompt exibido no seu programa. Você pode supor que a entrada não contém caracteres de espaço em branco à esquerda ou à direita.
Renderização
Você deve renderizar o fractal da seguinte maneira:
- Escolha quantas cores as raízes de P mais uma cor extra para divergência
- Para cada número no plano visível, determine se o método converge e se sim para qual raiz. Pinte o ponto de acordo com o resultado.
- Não imprima réguas ou outras coisas sofisticadas
- Imprima um ponto preto nos pontos, que são as raízes dos polinômios para orientação. Você pode imprimir até quatro pixels ao redor de cada raiz.
- Encontre uma maneira de escolher o plano visível de maneira que todas as raízes sejam distinguíveis e se espalhem amplamente, se possível. Embora não seja necessário um posicionamento perfeito do quadro de saída, reservo-me o direito de recusar uma resposta que escolha o quadro de uma maneira inaceitável, por exemplo. sempre nas mesmas coordenadas, todas as raízes estão em um ponto, etc.
- A imagem de saída deve ter um tamanho de 1024 * 1024 pixels.
- O tempo de renderização é de 10 minutos no máximo
- Usar valores de ponto flutuante de precisão única é suficiente
Saída
A saída deve ser uma imagem gráfica rasterizada em um formato de arquivo de sua escolha, legível por software padrão para um sistema operacional da marca X. Se você deseja usar um formato raro, considere adicionar um link a um site onde é possível baixar um visualizador para ele.
Envie o arquivo para stdout. Se o seu idioma não suportar colocar algo em stdout ou se você achar esta opção menos conveniente, encontre outra maneira. De qualquer forma, deve ser possível salvar a imagem gerada.
Restrições
- Nenhuma biblioteca de processamento de imagem
- Nenhuma biblioteca de geração de fractal
- O código mais curto vence
Extensões
Se você gosta dessa tarefa, pode tentar colorir os pontos de acordo com a velocidade da convergência ou com outros critérios. Eu gostaria de ver alguns resultados interessantes.