Um gráfico conectado é um gráfico que contém um caminho entre dois vértices.
Desafio
Construa um circuito [2-NAND-gate] que determina se um gráfico de 4 vértices está conectado.
(As 2 entradas de uma porta podem ser o mesmo bit de entrada ou outra porta.)
Saída True se o gráfico estiver conectado e False caso contrário.
Entrada
As seis arestas possíveis de um gráfico simples com 4 vértices:
[ 0 e 1 , 0 e 2 , 1 e 2 , 0 e 3 , 1 e 3 , 2 e 3 ]
onde um e b representa se existe uma aresta entre os vértices de um e b
A conexão é equivalente às seguintes condições:
Se menos de 3 entradas forem True, produza False.
Se mais de 3 entradas forem True, emita True.
Se exatamente 3 entradas forem Verdadeiras e formarem um triângulo, então produza Falso.
Caso contrário, produza True.
A resposta que usa o menor número de portões vence. Os laços serão quebrados pela
profundidade mais baixa do circuito (comprimento do (s) caminho (s) mais longo (s) da entrada à saída).
0
e1
? E quanto à saída?Respostas:
30 NANDS
Em vez de perguntar quando obtemos um 1, fiz a pergunta quando obtemos um 0. É melhor perguntar desta maneira, porque há menos 0s que 1s.
Aqui está a distribuição de acordo com o número de arestas (6a linha do triângulo de Pascal)
Fazendo a pergunta dessa maneira, obtemos o seguinte diagrama e expressão
Assumimos que a saída será padronizada como 1, mas será alterada para 0 sob qualquer uma das seguintes condições
1.A 0 para três arestas adjacentes (teste 3 entradas)
2.A 0 para dois pares de arestas opostos (teste 4 entradas)
Os termos acima já estão ordenados da maneira que permitirá que sejam agrupados conforme abaixo. (Aliás, esta versão da expressão é simétrica rotacionalmente perto do vértice AFB.)
A pontuação para cada um
&
ou|
é colocada abaixo do símbolo e justificada da seguinte forma:Nível 0: Investimos em um inversor para cada entrada: 6 NANDS
Nível 1: Podemos construir um OR a partir de uma porta NAND colocando um inversor na entrada (total de 3 NANDS), mas como já investimos em 6 NANDS na etapa anterior, podemos fazer 7 portas OR a partir de 7 portas NAND. Também precisamos de 3 portas. Para isso, apenas usaremos NANDs e deixaremos a saída invertida. 10 NANDS
Nível 2: Novamente construímos 4 portas OR a partir de portas NAND. Em cada caso, temos 1 entrada de uma porta OR, portanto, temos que inverter isso. Mas a outra entrada já está invertida (proveniente de uma das NANDs na etapa anterior que corresponde a um
&
símbolo em três casos e de um inversor na última), portanto, precisamos apenas de 2 portas para cada funcionalidade OR. 4 * 2 = 8Nível 3: agora precisamos AND das quatro saídas juntas. Isso requer 3 portas E, cada uma construída com 2 NANDs, 3 * 2 = 6
No total, são 30 portões NAND, com profundidade máxima de 2 + 2 + 4 = 8 NANDs para galhos com
|
nível 1 ou 3 + 1 + 4 = 8 NANDs para galhos com&
nível 1.O script Ruby a seguir confirma visualmente que a expressão acima é válida.
fonte
19 NANDs
Não existe um circuito mais simples que esse.
Há um código para testá-lo abaixo da imagem. Quanto à compreensão, isso é difícil. Existem alguns portões IF, e as entradas são agrupadas em um triângulo com as linhas de canto livres adicionadas para análise uma a uma, mas não de uma maneira simples. Se alguém conseguir entender, ficarei impressionado.
Código Verilog com teste:
Kim Øyhus
fonte
Mathematica, 17 portõesSimplesmente enumeramos todas as regras, construímos a função booleana e a minimizamos na
NAND
forma.Resultado :
, onde
#1...#6
estão 6 espaços para argumentos.Casos de teste :
fonte
not (p&q&r)
? O que o resultado final significa?p⊼q⊼r
significa(p⊼q)⊼r
que é equivalente a!(p&&q&&r)
.(p⊼q)⊼r
não é equivalente a!(p&&q&&r)
.64 NANDs
As seis arestas podem ser divididas em três pares de arestas opostas. Para que um gráfico seja conectado, deve haver duas arestas opostas e uma terceira aresta ou três arestas conectadas ao mesmo vértice.
Os pares opostos são UX, VY, WZ, então:
Construindo portas AND e OR da maneira usual, o número total de portas usadas é
3*3+7*3+34
= 64.fonte