Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Desenvolvido por:
José Meléndez
Tradução
Liliane Matsumoto
Proprietário
Emelzi Ltda. – respotasprovas.com
“Em toda turma da minha universidade, existe pelo menos um aluno canhoto.”
A) Existe uma turma na minha universidade na qual há, no máximo, um aluno canhoto.
B) Há, pelo menos, uma turma da minha universidade na qual não existe aluno canhoto.
C) Não há turma na minha universidade na qual todos os alunos sejam canhotos.
D) Em cada uma das turmas da minha universidade, não há aluno algum que seja canhoto.
E) Em nenhuma turma da minha universidade, há algum aluno que seja canhoto.
Para resolver esta pergunta é fundamental conhecer a lógica de primeira ordem (cálculo de predicados
de primeira ordem), especialmente os seguintes conceitos:
• Quantificador universal ∀𝑥 : significa “para todo x”, ou “todos os x” ou “em todos os x”.
• Quantificador existencial ∃𝑥 : significa “existe pelo menos um x” ou “alguns x”.
A negação de um quantificador universal corresponde a: ~[∀𝑥 : 𝑃(𝑥)] = ∃𝑥 | ~𝑃(𝑥). O
quantificador universal muda para o existencial, o “verifica-se que (:)” muda para “tal que (l)” o
predicado P(x) é negado. Exemplo: Exemplo: todos os homens são honestos. Então o universo
U seriam todos os seres humanos. O predicado P(x) seria “x é honesto”, e seria simbolizado
como ∀𝑥 ∈ 𝑈: 𝑃(𝑥). A negação do anterior seria ∃𝑥 ∈ 𝑈| ~𝑃(𝑥), ao realizar a conversão
obteríamos: “existe ao menos um homem que não é honesto”, ou também, “alguns homens
não são honestos”.
• A negação de um quantificador existencial é parecida a anterior: ~[∃𝑥 |𝑃(𝑥)] = ∀𝑥 : ~𝑃(𝑥).
Nota: O “tal que” está relacionado ao quantificador existencial e o “verifica-se que” está relacionado ao
quantificado universal.
“Em toda turma da minha universidade, existe pelo menos um aluno canhoto”.
Podemos observar que na frase anterior encontramos presente tanto o quantificador universal, como o
existencial. O quantificador universal inclui ao quantificador existencial de tal maneira que: ∀𝑦 : ∃𝑥 ∈
𝑈|𝑃(𝑥). Podemos ler o anterior como:
Ao aplicar uma negação, primeiro teríamos que negar o quantificador universal, trocando-o pelo
quantificador existencial. Depois, o “verifica-se que” seria trocado por “tal que”, e posteriormente
negamos o predicado, que nesse caso inclui um quantificador existencial, de tal maneira que ao aplicar
∃𝑦 |∀𝑥 ∈ 𝑈: ~𝑃(𝑥)
Há, pelo menos, uma turma da minha universidade na qual todos os alunos não são canhotos. O
anterior é equivalente a: Há, pelo menos, uma turma da minha universidade na qual não existe aluno
canhoto.
1 1 0 ∗ ∗ ∗ ∗
𝐻 = (0 1 1 ∗ ∗ ∗ ∗)
1 0 1 ∗ ∗ ∗ ∗
O enunciado indica que o código de Hamming é sistemático, isso significa que na palavra código em
que são gerados os primeiros "k” bits contêm a mensagem original que foi transmitida. Neste caso,
como é Hamming (7.4), onde a palavra código tem 7 bits (4 bits de dados e 3 bits de paridade), os
primeiros 4 bits correspondem à mensagem original descodificada.
O código Hamming só permite corrigir um bit errôneo, por esse motivo, ainda que apliquemos a
correção, a palavra recebida seguirá com erros.
Para obter o bit errôneo que será corrigido, calcula-se a síndrome, que resulta da multiplicação da
palavra código pela matriz de comprovação H. O vetor coluna resultante indica a posição em H do bit
que deve ser corrigido. No entanto, podemos ver que a matriz H tem alguns valores indefinidos, então
devemos preenchê-la com os 0s e os 1s que faltam.
Para preencher esses espaços, devemos levar em conta que cada coluna representa uma posição de
bit da palavra código, portanto, a coluna é uma representação binária de um número entre 1 e 7. Na
matriz H, já temos o valor das três primeiras colunas:
1 1 0 ∗ ∗ ∗ ∗
𝐻 = (0 1 1 ∗ ∗ ∗ ∗)
1 0 1 ∗ ∗ ∗ ∗
1
𝐶𝑜𝑙𝑢𝑛𝑎 1 = (0) = 5 = (101)
1
1
𝐶𝑜𝑙𝑢𝑛𝑎 2 = (1) = 6 = (110)
0
0
𝐶𝑜𝑙𝑢𝑛𝑎 3 = (1) = 3 = (011)
1
Portanto, os valores faltantes são 1, 2, 4 e 7. Como esses valores são distribuídos em H?
© 2019 Emelzi – www.respostasprovas.com | Todos os direitos reservados
Sabemos que um dos componentes da matriz H é uma matriz de identidade, por meio da equação 𝐻 =
(−𝑃𝑇 |𝐼𝑟 ) podemos determinar que essa matriz de identidade ocupa as três últimas colunas, assim:
1 1 0 ∗ 1 0 0
𝐻 = (0 1 1 ∗ 0 1 0)
1 0 1 ∗ 0 0 1
Percebendo o acima, nós já colocamos as posições 4 = 100, 2 = 010 e 1 = 001. Nós só precisamos da
posição 7 = 111 que corresponderia à única coluna que estava disponível
1 1 0 1 1 0 0
𝐻 = (0 1 1 1 0 1 0)
1 0 1 1 0 0 1
Uma vez que temos H, multiplicamos pelo vetor de coluna da palavra de código com erros que foram
recebidos (0 1 1 1 1 0 0), e assim obtemos a síndrome:
0
1
1 1 0 1 1 0 0 1 3
𝑆(𝑌 ′ ) = 𝑌 ′ 𝐻 = (0 1 1 1 0 1 0) . 1 = (3)
1 0 1 1 0 0 1 1 2
0
(0)
No vetor resultante, que corresponde à síndrome, se um número é par então ele corresponde a um
zero e, se for ímpar, corresponde a 1:
0
1
1 1 0 1 1 0 0 1 3 1
𝑆(𝑌 ′ ) = 𝑌 ′ 𝐻 = (0 1 1 1 0 1 0) . 1 = (3) = (1)
1 0 1 1 0 0 1 1 2 0
0
(0)
O sistema indica que o erro está na posição 1 1 0, no caso de H, corresponde à segunda coluna. Então,
o sistema corrigirá o segundo bit da palavra de código incorreta que foi recebida, permanecendo assim:
Como os primeiros 4 bits são aqueles correspondentes à palavra x enviada, então x = 0011. Como
mencionado acima, o código de Hamming somente permite corrigir um erro, portanto, a palavra x
recebida ainda teria erros em relação àquela que realmente foi enviada.
Assumindo que a instrução c=c+1 é 𝑂(1), a expressão que melhor define a ordem de complexidade
desse trecho é:
Sabemos que para determinar a complexidade de um algoritmo de dois bucles for aninhados, como no
caso atual, calculamos a complexidade de ambos os bucles for e multiplicamos.
O primeiro bucle for inicia a iteração desde o um e aumenta duas vezes na próxima iteração, então
podemos ver que ele cresce exponencialmente na base dos. Isso implica que o número de iterações
necessárias para atingir o limite n depende de quantas vezes temos que elevar o número 2 para
alcançar esse número. Levando em conta o anterior, podemos ter uma ideia de qual é a operação
matemática que nos permite calcular esse valor, efetivamente, precisamos dos logaritmos, neste caso
seria um logaritmo na base dois para obter o número de iterações do primeiro bucle for.
Ilustraremos com o seguinte exemplo:
Se n fosse igual a 32, i assumiria os seguintes valores antes de atingir 32 – não incluímos o 32 porque
a condição de parada é i < n, y Log232 = 5, que no nosso caso corresponde ao número de iterações
necessárias. Embora o 32 não esteja incluído, devemos ter em mente que o bucle começa em 1, que
é igual a 20, essa iteração do expoente 0 compensa que o limite seja aberto.
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
Tendo em conta o que foi exposto acima, pode concluir-se que a complexidade do primeiro bucle for é
Log2n.
O segundo bucle for, é muito mais fácil de deduzir, a variável j vai desde 1 até o valor de n e aumenta
de 1 a 1, portanto, a complexidade desse bucle for é n.
Alternativa A. FALSA. A principal característica dos hipergrafos é que suas aristas podem conectar
mais de dois vértices. Fonte [14]: https://pt.wikipedia.org/wiki/Hipergrafo
Alternativa B. FALSA. Um grafo ponderado pode ser direcionado ou não direcionado, e não precisa
que todos os pares de vértices sejam adjacentes entre si (esse só é obrigatório para os grafos tipo
completo). Fonte: Lipschutz, S., Lipson, M., Quezada Batalla, M. and Villagómez Velázquez, H. (2009).
Matemáticas discretas. 1st ed. México, D.F.: McGraw-Hill. Pagina 162.
Alternativa C. FALSA. Esta definição corresponde as árvores. No caso, se o grafo for acíclico, mas não
conexo, ele é chamado de floresta. Fonte: SZWARCFITER, Jayme Luiz (1988). Grafos e algoritmos
computacionais. Rio de Janeiro: Campus. p. 43-45.
Alternativa E. VERDADEIRA. Fonte: Lipschutz, S., Lipson, M., Quezada Batalla, M. and Villagómez
Velázquez, H. (2009). Matemáticas discretas. 1st ed. México, D.F.: McGraw-Hill. Pagina 204.
a) Quanto tempo levará o programa teste para executar se o tempo para executar uma micro-instrução
for aumentado para 30 nanossegundos?
b) Quanto tempo levará o programa teste para executar se uma instrução de máquina convencional
necessitar de somente 15 microinstruções para ser interpretada?
O primeiro que devemos nos perguntar é quantas microinstruções o teste consome. Levando em conta
que são necessários 50 segundos para executar e que cada micro-instrução consome 20
nanossegundos (20x10-9 segundos), o número de microinstruções é definido por:
50𝑠
𝑁𝑜. 𝑑𝑒 𝑚𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡𝑟𝑢çõ𝑒𝑠 = = 2,5 ∗ 109 𝑚𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡𝑟𝑢çõ𝑒𝑠
20 ∗ 10−9 𝑠⁄
𝑀𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡.
Agora, se cada instrução aumenta para 30 nanossegundos, teríamos um tempo de execução de:
−9
𝑇𝑎 = 2,5 ∗ 109 𝑚𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡. ∗ 30 ∗ 10 𝑠⁄𝑚𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡. = 75 ∗ 109−9 𝑠 = 75 ∗ 100 𝑠 = 75𝑠
Neste ponto, já sabemos que a resposta correta é D. Agora, para saber quanto tempo o programa
levará se você precisar apenas de 15 microinstruções, é considerado o seguinte:
O programa leva 50 segundos para rodar com 25 microinstruções, se reduzido a 15 microinstruções,
temos que:
15 𝑚𝑖𝑠𝑐𝑟𝑜𝑖𝑛𝑠𝑡
∗ 100% = 60%
25 𝑚𝑖𝑐𝑟𝑜𝑖𝑛𝑠𝑡
Apenas 60% da quantidade de instruções originais são necessárias, assumindo que o consumo de
tempo é linearmente proporcional ao número de instruções, o novo tempo consumido seria dado por: