Desafio: Pontos Inteiros em Posição Geral

Escolher pontos com coordenadas inteiras é fácil. Fazer com que todas as distâncias entre eles também sejam inteiras já exige algum trabalho.

Agora acrescente duas condições: nenhuma reta pode conter três desses pontos, e nenhuma circunferência pode conter quatro.

Quantos pontos você consegue encontrar?

O desafio

Escreva um programa que receba um inteiro $n \geq 4$ (idealmente para $n \geq 8$) e tente construir um conjunto de $n$ pontos distintos no plano:

$$ S = {P_1, P_2, \ldots, P_n}, \qquad P_i = (x_i, y_i). $$

O conjunto deve satisfazer simultaneamente as quatro condições abaixo.

1. Coordenadas inteiras

Cada ponto deve ter coordenadas inteiras:

$$ x_i, y_i \in \mathbb{Z}. $$

Coordenadas negativas e iguais a zero são permitidas.

2. Distâncias inteiras

A distância euclidiana entre quaisquer dois pontos distintos deve ser um inteiro positivo:

$$ d(P_i, P_j) = \sqrt{(x_i - x_j)^2 + (y_i - y_j)^2} \in \mathbb{Z}_{>0}. $$

Essa condição vale para todos os pares, incluindo pontos que não sejam vizinhos em uma eventual representação como polígono.

3. Nenhuma trinca colinear

Não podem existir três pontos distintos pertencentes à mesma reta.

4. Nenhuma quádrupla concíclica

Não podem existir quatro pontos distintos pertencentes à mesma circunferência.

A restrição vale para qualquer grupo de quatro pontos, mesmo que o restante do conjunto esteja fora dessa circunferência.

Exemplo válido

Para $n=4$, uma solução é:

0 0
3 4
6 0
3 -4

As seis distâncias são:

ParDistância
$P_1, P_2$5
$P_1, P_3$6
$P_1, P_4$5
$P_2, P_3$5
$P_2, P_4$8
$P_3, P_4$5

Nenhuma trinca é colinear.

Os quatro pontos também não são concíclicos: um centro equidistante de $P_1$ e $P_3$ deve ter $x=3$, enquanto um centro equidistante de $P_2$ e $P_4$ deve ter $y=0$. O único centro possível seria $(3,0)$, mas as distâncias desse centro aos pontos são 3 e 4.

Entrada e saída

Seu programa deve receber a quantidade desejada de pontos:

4

Caso encontre uma solução, deve informar os pontos e o resultado de uma verificação independente:

Status: solução encontrada
Quantidade: 4

0 0
3 4
6 0
3 -4

Coordenadas inteiras: sim
Pontos distintos: sim
Distâncias inteiras: sim
Nenhuma trinca colinear: sim
Nenhuma quádrupla concíclica: sim
Conjunto válido: sim

Você pode adicionar parâmetros como limite das coordenadas, tempo máximo de execução e semente aleatória.

Se a busca terminar sem alcançar o objetivo, informe isso explicitamente:

Status: tempo máximo atingido
Quantidade solicitada: 5
Quantidade encontrada: 4
Conjunto parcial válido: sim

Não encontrar uma solução não demonstra que ela seja impossível.

Implemente também uma verificadora

Além do gerador, escreva uma função que receba um conjunto de pontos e confira todas as condições.

A verificadora deve funcionar inclusive para conjuntos fornecidos manualmente, sem depender de informações internas do gerador.

Algumas dicas para evitar erros numéricos:

  • Para verificar distâncias, teste se a distância ao quadrado é um quadrado perfeito.
  • Para verificar colinearidade, use o determinante que representa o dobro da área do triângulo.
  • Para verificar conciclicidade, use um determinante com as coordenadas dos quatro pontos.
  • Utilize inteiros com precisão suficiente para evitar overflow.

Para quatro pontos, o teste de conciclicidade utiliza:

$$ \begin{vmatrix} x_1 & y_1 & x_1^2+y_1^2 & 1 \\ x_2 & y_2 & x_2^2+y_2^2 & 1 \\ x_3 & y_3 & x_3^2+y_3^2 & 1 \\ x_4 & y_4 & x_4^2+y_4^2 & 1 \end{vmatrix} = 0. $$

Depois de excluir trincas colineares, um determinante nulo indica quatro pontos concíclicos.

Como comparar as soluções

Ao apresentar sua implementação, registre:

  • Quantidade de pontos encontrados.
  • Maior valor absoluto entre as coordenadas.
  • Tempo de construção e tempo de verificação, separadamente.
  • Estratégia de busca e parâmetros utilizados.
  • Código e instruções para reproduzir o resultado.

O objetivo principal é encontrar conjuntos válidos maiores. Para conjuntos do mesmo tamanho, coordenadas menores e menor tempo de execução são critérios adicionais interessantes.

Sua solução é capaz de computar um conjunto com mais de 7 pontos?