Esta pergunta é sobre pilhas de areia abelianas . Leia este desafio anterior e assista ao vídeo numberphile para saber mais.
Uma pilha de areia abeliana de tamanho n por n é uma grade contendo o número 0, 1, 2 e 3 (representando o número de grãos de areia). A adição de dois montes de areia funciona primeiro adicionando elemento por elemento e, em seguida, derrubando qualquer elemento acima de 3. A ordem na qual você tomba não importa, o resultado final é o mesmo. Quando uma célula tomba, seu número diminui em 4 e cada um de seus vizinhos diretos aumenta em 1. Isso pode causar uma reação em cadeia. Se uma célula estiver na borda da grade, todos os grãos que caem da grade enquanto caem desaparecem.
Por exemplo, estou adicionando duas pilhas de areia de 3 por 3 (dando uma reação em cadeia bastante extrema):
3 3 3 1 2 1 4 5 4 4 6 4 6 2 6 6 3 6 2 5 2 4 1 4 4 2 4 0 4 0 2 0 2 2 1 2
3 3 3 + 2 1 2 = 5 4 5 -> 6 0 6 -> 2 4 2 -> 3 0 3 -> 5 0 5 -> 1 4 1 -> 2 0 2 -> 4 0 4 -> 0 4 0 -> 1 0 1
3 3 3 1 2 1 4 5 4 4 6 4 6 2 6 6 3 6 2 5 2 4 1 4 4 2 4 0 4 0 2 0 2 2 1 2
Neste desafio, estamos interessados em um subconjunto de todos os n possíveis n por n sandpiles. Esse subconjunto contém qualquer arquivo de areia que você pode obter adicionando um arquivo de areia arbitrário ao arquivo de areia all-3s n por n . Por exemplo, logo acima vimos que212 | 101 | 212
está no subconjunto, porque o conseguimos adicionando algo ao monte de areia all-3.
Agora esse subconjunto tem um elemento interessante: o elemento de identidade . Se você pegar esse elemento e adicioná-lo a qualquer outro elemento no subconjunto , a soma permanecerá inalterada. Em outras palavras, esse sandpile age como um zero desse subconjunto. Acontece que esse 212 | 101 | 212
é o elemento zero para o subconjunto de 3 por 3. Por exemplo:
2 2 2 2 1 2 4 3 4 0 5 0 2 1 2 2 2 2
2 2 2 + 1 0 1 = 3 2 3 -> 5 2 5 -> 1 6 1 -> 2 2 2
2 2 2 2 1 2 4 3 4 0 5 0 2 1 2 2 2 2
Agora, este é o seu desafio: dado n , encontrar o elemento identidade do subconjunto do n por n grade . Faça a saída atribuindo uma cor exclusiva com contraste suficiente de sua escolha para cada uma 0, 1, 2, 3
e produzindo uma imagem n por n. Seu código deve ser capaz de produzir a caixa de 50 por 50 em menos de um minuto em um PC moderno e razoável.
Por exemplo, o elemento de identidade 500 por 500:
Aqui está azul = 3, verde = 2, vermelho = 1, branco = 0. Mas você não precisa usar esse esquema de cores na sua resposta.