Unidade de Ensino de Matem´atica Aplicada e An´alise Num´erica Departamento de Matem´atica/Instituto Superior T´ecnico
Matem´atica Experimental (LMAC) – 1o Semestre de 2019/2020
Exame – 13 de Janeiro de 2020 - Resolu¸c˜ao
Apresente todos os c´alculos e justifique convenientemente todas as suas respostas.
1. Considere a seguinte fun¸c˜ao Mathematica f[n Integer/;n>=2]:=
Apply[Nor,Divisible[n,Select[Range[2,Floor[Sqrt[n]]],PrimeQ]]]
Qual ´e o resultado da instru¸c˜ao {f[97],f[113],f[133]}? [1.5]
Resolu¸c˜ao: O resultado da execu¸c˜ao {f[97],f[113],f[133]} ´e a lista {True,True,False}. O co- mando Range[2,Floor[Sqrt[n]]]gera uma lista de inteiros de 2 ab√
nc. A instru¸c˜ao Select[Range[2,Floor[Sqrt[n]]],PrimeQ]
selecciona dessa lista os n´umeros primos. O comando
Divisible[n,Select[Range[2,Floor[Sqrt[n]]],PrimeQ]]
testa, para cada um dos elementos da lista de primos {2,3, . . . ,b√
nc}, se ele divide ne , se dividir, devolve True, caso contr´ario devolveFalse. Finalmente, a instru¸c˜ao
Apply[Nor,Divisible[n,Select[Range[2,Floor[Sqrt[n]]],PrimeQ]]]
devolve Truese todos os elementos da lista booleana
Divisible[n,Select[Range[2,Floor[Sqrt[n]]],PrimeQ]]
tˆem o valor True e False se pelo menos um deles ´e False. Por outras palavras devolve True se o naturaln´e divis´ıvel por um dos primos≤√
neFalseno caso contr´ario. Isto quer dizer que devolve True se o naturalnfor primo eFalsese ele ´e composto. Quando aplicarmos a fun¸c˜ao faos naturais 97,113e 133, o resultado ´e True,Truee Falsevisto que97,113s˜ao primos e133´e composto. Por exemplo
Range[2,Floor[Sqrt[133]]]→ {2,3,4,5,6,7,8,9,10,11}
e 133=7·19ou seja133´e divis´ıvel por7.
2. Considere as seguintes instru¸c˜oesMathematica
code[m Integer/;m>0]:=If[EvenQ[m],code[m/2],code[3 m+1]];
code[1]=0;
Se executar code[10] que resultado espera obter? Se n˜ao definir code[1]=0 o que acontece quando
executar code[10]? [2.0]
Resolu¸c˜ao: O c´odigo code define a itera¸c˜ao de Collatz atrav´es da programa¸c˜ao recursiva. O code recebe um inteiro positivo m e divide-o por 2 se ele for par e multiplica por 3 e soma a 1 se ele for
´ımpar. Sem o comandocode[1]=0, qualquer que fossem, o programa entraria no ciclo{4,2,1}e n˜ao parava. Mais precisamente, devolvia a mensagem de erro:
$IterationLimit::itlim:Iteration limit of 4096 exceeded.
Com a instru¸c˜ao code[1]=0, o programa para e devolve 0quando chega a 1. Portanto o resultado da execu¸c˜ao code[10]´e 0.
3. Considere a lista fermatdefinida por
fermat=Map[Function[n,{n,2ˆn-1}],Range[12]]
a) Que tipo de objetos s˜ao os elementos da listafermat? [1.0]
Resolu¸c˜ao: Os12elementos da listafermats˜ao pares de inteiros da forma {n,2ˆn-1}em quenvaria entre 1e 12.
b) Defina os pseudoprimos de Fermat na basea∈N, a6= 1,e construa uma express˜ao Mathematica que selecciona da lista fermatos pseudoprimos de Fermat na base 2. A lista fermatcont´em alguns
pseudoprimos de Fermat na base 2? Quais? [1.5]
Resolu¸c˜ao: Os pseudoprimos de Fermat na base a ∈ N, a 6= 1, s˜ao n´umeros compostos n tais que an−1 ≡ 1 (mod n), i.e. n´umeros compostos que satisfazem a congruˆencia de Fermat. Os elementos 2ˆn-1 na lista fermat s˜ao n´umeros de Mersenne quando n ´e primo. Sabe-se que os n´umeros de Mersenne ou s˜ao primos de Mersenne ou pseudoprimos de Fermat na base 2. Existem 5 n´umeros de Mersenne Mn na listafermat, nomeadamente
M2 = 3, M3 = 7, M5 = 31, M7= 127, M11= 2047.
Desses cinco apenas o M11´e composto, ou seja, ´e um pseudoprimo de Fermat na base 2. A instru¸c˜ao Mathematicaque selecciona da lista fermatos pseudoprimos de Fermat na base 2 pode ser
Flatten[Drop[Select[fermat,Function[x,PrimeQ[x[[1]]]==
True && PrimeQ[x[[2]]]==False]],None,{1}]]
ou simplesmente
Select[fermat,Function[x,PrimeQ[x[[1]]]==True && PrimeQ[x[[2]]]==False]]
que devolve uma lista de elementos{n,2ˆn-1}em que2ˆn-1´e um pseudoprimo de Fermat na base 2.
4. Sejar = (1 +√
5)/2. Prove que
r= (1 + (1 + (1 +. . .)1/2)1/2)1/2. [2.0]
Resolu¸c˜ao: Note-se primeiro que
r2= (1 + (1 + (1 +. . .)1/2)1/2= 1 +r . Portanto
r2−r−1 = 0 ⇐⇒ r= 1±√ 5
2 ,
e, comor >0, conclui-se quer = 1+
√ 5 2 .
5. Defina uma fun¸c˜ao Mathematicaque receba um naturalne devolva todos os naturaisk, inferiores a n, tais que k ´e um n´umero triangular ek+ 1 ´e um quadrado perfeito. Consegue determinar algum
desses naturais k? [2.0]
Resolu¸c˜ao: Os n´umeros triangulares s˜ao n´umeros inteiros da forma m(m+1)2 , para algum natural m.
Podemos assim definir, com o comando Table, uma lista de n´umeros triangulares e seleccionar dessa lista os quadrados perfeitos com a instru¸c˜aoIntegerQ[Sqrt[x]]que devolveTrue se√
xfor inteiro.
A fun¸c˜aoMathematicafica ent˜ao f[n Integer/;n>0] :=
Select[Table[j∗(j+1)/2,{j,1,n}],Function[x,IntegerQ[Sqrt[x+1]] && x<n]]
onde a condi¸c˜ao x<ngarante que a fun¸c˜aofdevolva os naturaiskinferiores anvisto que a instru¸c˜ao Table[j∗(j+1)/2,{j,1,n}]gera uma lista de n´umeros triangulares at´e n(n+1)2 .
E f´´ acil ver que o n´umero k = 3 ´e triangular e k+ 1 = 4 ´e um quadrado perfeito. Os pr´oximos exemplos s˜ao k= 15 e k= 120.
6. Escreva um programa Mathematica que receba dois naturaisae be devolva a fra¸c˜ao cont´ınua sim- ples finita [a0, a1, . . . , an] do racional a/b. Deve validar convenientemente os dados e determinar os elementos da frac¸c˜ao cont´ınua pelo algoritmo de Euclides. [2.0]
Resolu¸c˜ao: Os elementos aj da fra¸c˜ao cont´ınua [a0, a1, . . . , an] do racional a/b correspondem aos quocientes no algoritmo de Euclides, ver os slides Aulas 11-15. O c´odigoMathematicafica assim
fcEuclides[a_Integer, b_Integer /;b >0]:= Module[{r0=a,r1=b,r2=Mod[a,b],
qlist= {Quotient[a,b]}}, While[r2≠0,
r0=r1;
r1=r2;
r2=Mod[r0,r1];
AppendTo[qlist, Quotient[r0, r1]]]; qlist];
7. a)Determine a fra¸c˜ao cont´ınua dex=√
37. [1.5]
Resolu¸c˜ao: Temos
√
37 = 6 + (√
37−6) = 6 + 1
√37 + 6 ,
√
37 + 6 = 12 + (√
37−6) = 12 + 1
√37 + 6 ,
⇒ √
37 = [6; 12 ], i.e. a fra¸c˜ao cont´ınua de√
37 ´e infinita peri´odica da forma √
37 = [6; 12,12, . . .].
b) Determine todos os pares de naturais{p, q}, para 1≤q ≤1500,tais que
q√
37−p <
n√
37−m
, ∀m, n∈N, m
n 6= p
q , n≤q . [1.0]
Resolu¸c˜ao: Note-se que um n´umero fraccion´ario pq diz-se melhor aproxima¸c˜ao racional p/q de um n´umero real x se para todos os racionais mn, tais que mn 6= pq e 1≤n≤q, temos
|q x−p|<|n x−m|.
Portanto, os pares de naturais {p, q} correspondem a alguns dos melhores aproxima¸c˜oes racionais de
√37. Por outro lado, um n´umero fraccion´ario ´e melhor aproxima¸c˜ao racional de um n´umero real x se e s´o se ele for convergente da fra¸c˜ao cont´ınua dex. Os primeiros convergentes de √
37 s˜ao c0 = 6, c1= 6 + 1
12 = 73
12, c2 = 6 + 1
12 + 121 = 882
145, c3= 6 + 1 12 + 1
12+121
= 10657 1752 . Assim os pares de naturais {p, q}, com 1≤q ≤1500,tais que
q√
37−p <
n√
37−m
, ∀m, n∈N, m
n 6= p
q , n≤q , s˜ao {6,1},{73,12} e{882,145}.
8. Considere a seguinte a fun¸c˜ao Mathematica
f[a Integer,b Integer]/;a∗b6=0:=Minimize[a∗x+b∗y,a∗x+b∗y>0,{x,y},Integers]
Se executarTable[Map[f,{{13,65},{13,7},{-2,-8}}][[k,1]],{k,1,3}]que resultado espera ob-
ter? [1.5]
(O Help do sistemaMathematica cont´em a seguinte informa¸c˜ao: Minimize[{f,cons},{x,y,...},dom]}
minimizes f subject to the constraints cons over the domain dom and returns a list of the form {fmin,{x→xmin,y →ymin, ... }} .
Resolu¸c˜ao: Dados dois inteiros n˜ao nulos a,b∈ Z, o valor m´ınimo positivo da express˜ao ax+by, x,y∈Z, corresponde, pelo Lema de B´ezout, ao m´aximo divisor comum dea eb. Portanto, a fun¸c˜ao f recebe dois inteiros n˜ao nulos e devolve uma lista em que o primeiro elemento fmin ´e o m´aximo divisor comum de aebe o segundo elemento ´e um par de elementos da forma{x→xmin,y →ymin} em que os inteiros xmin e ymin s˜ao tais que
mdc(a,b) = min x,y∈Z
ax+by=axmin+bymin.
Portanto ao executar a instru¸c˜ao Table[Map[f,{{13,65},{13,7},{-2,-8}}][[k,1]],{k,1,3}] , obt´em-se uma lista com os m´aximos divisores comuns de {13,65},{13,7} e{-2,-8}ou seja, a lista {13,1,2}. Note-se que ao executar o comando Table[. . .[[k,1]],{k,1,3}], extrai-se, para cadak, apenas o primeiro elemento da lista {fmin,{x→xmin,y →ymin}}.
9. A representa¸c˜ao do n´umero fraccion´ario 1/17 na base 2 e finita ou infinita? Caso seja infinita,
determine a periodicidade da representa¸c˜ao. [1.5]
Resolu¸c˜ao: A representa¸c˜ao na base 2 do n´umero fraccion´ario 1/17 ´e infinita peri´odica visto que mdc(2,17)=1. Temos ainda
21 ≡2 (mod 17), 22≡4 (mod 17), 23 ≡8 (mod 17), 24 ≡16 (mod 17) 25 = 32≡15 (mod 17), 26 = 64≡13 (mod 17), 27 = 128≡9 (mod 17), 28= 256≡1 (mod 17). Portanto a ordem de 2 m´odulo 17 e, por conseguinte, o per´ıodo da representa¸c˜ao de 1/17 na base 2,
´
e igual a 8.
10. Considere o seguinte c´odigo Mathematica
code[f ,a ,b ,nmax Integer]/;(f[a]∗f[b]<0 && nmax>1):=
Module[{i=1,x0,a0=N[Min[a,b]],b0=N[Max[a,b]]}, x0=(a0+b0)/2;
While[i <= nmax && f[x0]6=0,
If[f[a0]∗f[x0]<0,b0=x0,a0=x0];i++;x0=(a0+b0)/2];
x0]
a) Se executar a instru¸c˜ao
code[Function[x,Exp[x-2]-xˆ2],0,1,4]
que resultado espera obter? [1.5]
Resolu¸c˜ao: O c´odigocodecorresponde `a implementa¸c˜ao (em linguagemMathematica) do m´etodo da bisec¸c˜ao, ver os slidesAula 20. O programacoderecebe a fun¸c˜aof, cujo zero se pretende aproximar pelo m´etodo da bisec¸c˜ao, os extremos a e b de um intervalo em que a fun¸c˜ao f muda de sinal (a condi¸c˜ao f[a]∗f[b]<0), e o n´umero m´aximo de itera¸c˜oesnmax. O programa come¸ca por determinar o intervalo [a0,b0] tal que a0<b0 (note-se que os valores s˜ao num´ericos a partir desta altura) e calcula o ponto m´edio x0 desse intervalo. Depois, no cicloWhile, o programa passa para o intervalo [a0,x0] ([x0,b0]) sefmudar de sinal no intervalo[a0,x0] ([x0,b0]) e assim sucessivamente at´e que o n´umero m´aximo de itera¸c˜oes for atingido ouf[x0]=0. O programa devolve a itera¸c˜ao da ordem nmax), visto quex0=(a0+b0)/2.
Quando executarmos
code[Function[x,Exp[x-2]-xˆ2],0,1,4]
estamos a aproximar o zero da fun¸c˜aof(x) =ex−2−x2no intervalo [0,1]. ´E importante verificar que f(0) =e−2 = 0.135335>0, f(1) =e−1−1 =−0.632121<0,
ou seja f tem pelo menos um zero em [0,1]. Desenhando o gr´afico da fun¸c˜ao f, vˆe-se que ela possui trˆes zeros,z1 ∈[−1,0], z2∈[0,1] ez3∈[5,6], i.e. apenas um zero em [0,1]. O programacodeefetua 4 itera¸c˜oes no cicloWhile, depois de primeiro ter calculado x0=0.5. Obtemos assim os valores
x1=0.25, x2=0.375, x3=0.4375, x4=0.46875. Portanto o resultado da execu¸c˜ao ´e 0.46875.
b)Modifique o programacode de modo a que ele receba, para al´em def,a,benmax, um valor >0 e devolva uma aproxima¸c˜ao da raiz da equa¸c˜ao f(x) = 0 com um erro inferior a . [1.0]
Resolu¸c˜ao: A modifica¸c˜ao pode ser
codigo1[f_, a_, b_,nmax_Integer, eps_] /;(f[a] *f[b] <0 &&nmax>1):= Module[{i=1, x0,a0=N[Min[a, b]],b0=N[Max[a, b]]},
x0= (a0+b0) /2;
While[i≤nmax&&f[x0]≠0 && Abs[a0-b0] /2>eps,
If[f[a0] *f[x0] <0, b0=x0,a0=x0];i++;x0= (a0+b0) /2]; {x0,i}]
Note-se que, se z for o zero def que estamos a aproximar, temos para o erro da iterada xk
|z−xk| ≤ bk−ak
2 .
em quexk= ak+b2 k. Embora n˜ao tenha sido pedido, o programacodigo1devolve tamb´em o n´umero de itera¸c˜oesipara que o utilizador possa averiguar qual dos crit´erios de paragem,i>nmaxou bk−a2 k ≤, foi atingido primeiro.