3.2 KiB
Logaritmos
Exercícios 2
1. Prove os dois invariantes da primeira versão da função lg:
int lg (int N)
{
int i, n;
i = 0;
n = 1;
while (n <= N/2) {
n = 2 * n;
i += 1;
}
return i;
}
Um invariante é uma propriedade a qual invariavelmente é verdadeira durante toda a execução de um loop, de tal forma que a corretude deste pode ser demonstrada se a invariante se mantêm verdadeira
-
antes da iteração inicial (
i = 0
), -
para cada iteração subsequente (se verdadeira em
i = k
, também o é parai = k + 1
) -
e ao término do loop (
i = n
, onden
é o valor de parada)
Para o algoritmo acima, seja N \in \N
, temos como invariantes que n \le N
e i = \log_2n
.
Prova
Para n
temos:
-
Inicialização: Para
N = 1
,n_0 = 1
, entãon_0 \le N
. -
Manutenção: Para
N = k
na iteraçãox
,x > 0
, assumimosn_x \le k/2
. Ai para iteraçãox + 1
temos que o valor den_{x + 1} = 2n_x
. Comon_x \le k/2
, tem-se quen_{x + 1} \le k
, ou seja,n_{x + 1} \le N
. -
Término: Para se encerrar na iteração
x
tem-se quen_x > N/2
seja porquen = N = 1
ou, senão, porquen_x > N \div 2
quandon_{x - 1} \le N/2
. No primeiro caso nada resta a demonstrar, mas no segundo caso segue quen_x = 2n_{x - 1}
, então