Fun\347\365es Matem\341ticasDefinindo uma Fun\347\343oO Maple tem uma grande variedade de fun\347\365es definidas internamente, incluindo as fun\347\365es trigonom\351tricas, hiperb\363licas, el\355ticas, hipergeom\351tricas, de Bessel e muitas outras. A lista completa pode ser obtida atrav\351s do help on line com o comando ?inifcn. Todos os comandos do Maple, como o comando de integra\347\343o, de diferencia\347\343o, de limite, etc., est\343o aptos a reconhecer estas fun\347\365es e fornecer o resultado conveniente. Por maior que seja a lista das fun\347\365es definidas internamente pelo Maple, um usu\341rio necessita definir suas pr\363prias fun\347\365es, por exemplo, generalizando fun\347\365es j\341 existentes. Estas fun\347\365es definidas pelo usu\341rio ser\343o incluidas na lista das fun\347\365es do Maple no sentido de que elas tamb\351m ser\343o reconhecidas pelos comandos de diferencia\347\343o, integra\347\343o, etc., como fun\347\365es v\341lidas, mas n\343o ser\343o reinicializadas automaticamente caso o usu\341rio sai do Maple ou d\352 o comando restart.Para definir uma fun\347\343o no Maple, devemos usar o operador seta (->, isto \351, sinal de menos seguido do sinal de maior). Por exemplo, a fun\347\343o NiMvLSUiZkc2IyUieEcqJiwmKiRGJyIiIyIiIkYsISIiRiwsJkYqRixGLEYsRi0= \351 definida da seguinte maneira.f := x -> (x^2-1)/(x^2+1);Podemos avaliar essa fun\347\343o em um ponto ou encontrar sua derivada.f(1);A t\355tulo de precau\347\343o, vamos avisar o seguinte. N\343o defina uma fun\347\343o da formag(x) := x^2;Na forma acima, o m\341ximo que o Maple sabe \351 que o valor da fun\347\343o NiMlImdH no ponto NiMlInhH \351 NiMqJCUieEciIiM=. Nada mais. O valor de NiMlImdH no ponto 2? O Maple n\343o sabe!g(2);Para a maior parte dos usu\341rios, o que foi dito acima \351 suficiente para se trabalhar com fun\347\365es no Maple, e portanto o leitor pode pular para a pr\363xima se\347\343o. Caso o usu\341rio enfrente algum problema, ele deve ler o resto dessa se\347\343o que tem um grau de dificuldade acima da m\351dia desta apostila. Primeiramente, \351 importante distinguir fun\347\343o de express\343o alg\351brica. Vejamos primeiro uma express\343o alg\351brica que n\343o \351 uma fun\347\343o.expr := sin(a*x);No comando acima, NiMtJSRzaW5HNiMqJiUiYUciIiIlInhHRig= \351 uma express\343o que foi atribuida a vari\341vel f. N\343o podemos considerar f como uma fun\347\343o de x, pois n\343o obter\355amos o resultado desejado com o comando f(NiMlI3BpRw==):expr(pi);O resultado desejado era NiMtJSRzaW5HNiMqJiUiYUciIiIlI3BpR0Yo. Para obter o valor da fun\347\343o NiMtJSRzaW5HNiMqJiUiYUciIiIlInhHRig= em NiMvJSJ4RyUjUGlH, temos que usar o comando subs: subs(x=Pi, expr);ATEN\307\303O: Quando usar o operador seta (->), a express\343o da fun\347\343o deve ser dada explicitamente. Como consequ\352ncia da chamada de aten\347\343o acima podemos afirmar que: ``n\343o podemos usar % dentro do operador seta''. Veja a seguinte sequ\352ncia de comandos problem\341tica.x^2;f := x -> % + 1;f(2);Gr\341ficos Introdu\347\343oVamos ver alguns exemplos de gr\341ficos. Considere a seguinte express\343o como uma fun\347\343o de NiMlInhH.F := exp(-x^2)*sin(4*Pi*x);O seu gr\341fico no intervalo NiM3IzssJCIiIyEiIkYm \351plot(F, x=-2..2);Vamos agora fazer o gr\341fico de NiMlIkZH junto com as envolt\363rias. A curva NiMlIkZH em preto e as envolt\363rias em vermelho. Devemos colocar as fun\347\365es em uma lista (colchetes quadrados) com as cores correspondentes na op\347\343o color.plot( [F, exp(-x^2), -exp(-x^2)], x=-2..2, color=[black,red,red]);Vamos fazer o gr\341fico de duas superf\355cies que t\352m interse\347\343o. Note que usamos o comando plot3d no caso de gr\341ficos em 3 dimens\365es e plot no caso de 2 dimens\365es.plot3d({cos(sqrt(x^2+3*y^2))/(1+y^2/8), 2/15-(2*x^2+x^2)/50}, x=-3..3, y=-3..3, grid=[41,41], orientation=[-26,71], title=`Superficies com intersecao`);Gr\341ficos em 2 Dimens\365esIntrodu\347\343oA sintaxe para gerar gr\341ficos em 2 dimens\365es \351:plot( f(x), x = a .. b, op\347\365es)onde f(x) \351 uma fun\347\343o de uma vari\341vel e a..b \351 o intervalo de varia\347\343o da vari\341vel x. As op\347\365es s\343o da forma: nome da op\347\343o = tipo da op\347\343oA lista completa dos nomes das op\347\365es e seus tipo pode ser obtida atrav\351s do help on line com o comando ?plot,options. As op\347\365es servem para se obter os efeitos desejados em cada gr\341fico. Vamos ver alguns exemplos com v\341rios tipos de op\347\365es. Primeiro, vamos definir a fun\347\343o esf\351rica de Bessel a partir da fun\347\343o cil\355ndrica de Bessel: j := (n,x) -> sqrt(Pi/(2*x))*BesselJ(n+1/2,x);Agora, vamos fazer o gr\341fico da fun\347\343o de ordem zero com o t\355tulo ``Fun\347\343o Esf\351rica de Bessel'', com o nome ``j(0,x)'' no eixo vertical e controlando o n\372mero de marca\347\365es no eixo x e no eixo y:plot(j(0,x), x=0..15, `j(0,x)`=-0.5..1, xtickmarks=4, ytickmarks=6, title=`Funcao Esferica de Bessel`);Em v\341rias situa\347\365es, as op\347\365es s\343o necess\341rias, pois sem elas, o gr\341fico pode ficar ileg\355vel. Por exemplo, o gr\341fico da fun\347\343o tangente sem op\347\365es:plot( tan(x), x=-Pi..Pi);Aqui, precisamos da op\347\343o que limita o intevalo do eixo vertical:plot( tan(x), x=-Pi..Pi, -10..10);Vejamos outro exemplo. O gr\341fico da fun\347\343o a fun\347\343o NiMsJiUieEciIiItJSRzaW5HNiMqKCIiI0YlJSNQaUdGJUYkRiVGJQ== deve apresentar NiMiI10= m\341ximos no intervalor NiMvJSJ4RzsiIiEiI10=. Por\351m, vejamos o resultado:plot(x+sin(2*Pi*x),x=0..50);Este \351 um caso em que a op\347\343o numpoints \351 necess\341ria. O n\372mero de pontos default (50) n\343o foi suficiente para este caso:plot(x+sin(2*Pi*x),x=0..50,numpoints=1000);Agora, vamos ver outros tipos de gr\341ficos em 2 dimens\365es.Gr\341ficos de Pontos IsoladosPodemos fazer gr\341ficos de pontos isolados com a op\347\343o style=point:plot( sin, 0..2*Pi, scaling=constrained, style=point, numpoints=5);Quando atribuimos um gr\341fico a uma vari\341vel, podemos ver quais pontos o Maple escolheu para gerar o gr\341fico em quest\343o. sin_plot := %;Estes pontos n\343o s\343o igualmente espa\347ados, pois nas regi\365es onde a curvatura do gr\341fico \351 maior, o Maple escolhe mais pontos, como podemos verificar no gr\341fico anterior. Vamos fazer os mesmo gr\341fico, por\351m vamos n\363s mesmos escolher os pontos de forma que fiquem igualmente espa\347ados. Vamos gerar estes pontos com o comando seq:sin_points := seq( evalf([2*Pi*i/30,sin(2*Pi*i/30)],3), i=1..30);Vamos colocar a sequ\352ncia de pontos em uma lista, e fazer o gr\341fico com a op\347\343o style=points:plot([sin_points], scaling=constrained, style=point);Vejamos outro exemplo:pontos := seq([ i, ithprime(i) ],i =1..10);plot( [pontos], style=point);Sem a op\347\343o style=point, os pontos s\343o unidos por retas:plot( [pontos]);Gr\341ficos de Fun\347\365es Definidas ImplicitamenteVejamos um exemplo:with(plots):implicitplot(x^2-x+1/4+y^2-y+1/4=1,x=-1..2,y=-1..2,grid=[30,30], color=black);Exibindo v\341rios Gr\341ficos SimultaneamentePara exibir dois ou mais gr\341ficos simultaneamente, podemos usar o comando plot ou plot3d colocando as express\365es de cada gr\341fico dentro de uma lista, isto \351, entre colchetes, ou em um conjunto, isto \351, entre chaves. Vimos um exemplo no in\355cio deste cap\355tulo. Desta forma, todas a op\347\365es usadas ser\343o comuns a todos os gr\341ficos. Para fazer gr\341ficos com op\347\365es diferentes e mostr\341-los na mesma tela, temos que tomar outro caminho. Cada gr\341fico deve ser feito independentemente e atribu\355do a uma vari\341vel. Este comando de atribui\347\343o deve ser terminado com dois pontos ``:''. Para mostrar os gr\341ficos juntos, devemos usar o comando display ou display3d, dependendo se forem gr\341ficos em 2 ou 3 dimens\365es. As vari\341veis devem ser colocadas dentro de uma lista ou um conjunto. Estes comandos est\343o dentro do pacote plots. Vejamos um exemplo:with(plots):G1 := sphereplot(1, theta=0..Pi, phi=0..2*Pi):G2 := cylinderplot(1/2, theta=0..2*Pi, z=-2..2):display([G1,G2], scaling=constrained);Para ver um dos gr\341ficos isoladamente, basta avaliar a vari\341vel onde o gr\341fico foi guardado. Por exemplo, para ver a esfera:G1;Colocando Textos em Gr\341ficosOs comandos usuais de gerar gr\341ficos colocam uma s\351rie de textos no gr\341fico. Este \351 o caso do nome das coordenadas, do t\355tulo do gr\341fico entre outros. Podemos escolher as fontes atrav\351s das op\347\365es font, titlefont, axesfont e labelfont. Por\351m, para modificar a posi\347\343o destes textos, \351 necess\341rio proceder de outra forma. Devemos usar os comandos textplot e textplot3d, que t\352m as seguintes sintaxe:textplot( [coord-x, coord-y, `texto`] )etextplot3d( [coord-x, coord-y, coord-z, `texto`] )onde coord-x \351 um n\372mero especificando a posi\347\343o x do centro do texto. O mesmo com rela\347\343o a coord-y e coord-z. Estes comandos geram um gr\341fico com o texto desejado na posi\347\343o especificada. Com o comando display ou display3d juntamos estes gr\341ficos-textos com o gr\341fico das fun\347\365es em quest\343o. Vejamos um exemplo de composi\347\343o de v\341rios gr\341ficos-textos. Cada gr\341fico ser\341 atribuido a uma vari\341vel e os comandos ser\343o terminados com dois-pontos para evitar que informa\347\365es desnecess\341rias sejam mostradas na tela. Somente o comando display ser\341 terminado com ponto-e-v\355rgula:G1 := textplot([3.83,-0.5,`Primeiro mimimo da`]):G2 := textplot([3.83,-0.6,`funcao de Bessel`]):G3 := textplot([3.0,0.8,`J(0,x)`],font=[COURIER,BOLD,12]):G4 := plot(BesselJ(0,x), x=0..12, labelfont=[COURIER,BOLD,12], title=`Funcao de Bessel`, titlefont=[HELVETICA,OBLIQUE,15]):display({G1,G2,G3,G4});Para exibir letras gregas \351 necess\341rio usar a fonte symbol.Imprimindo Gr\341ficosPara imprimir gr\341ficos no formato PostScript, temos que modificar o valor da vari\341vel plotdevice para ps, e direcionar a saida para um arquivo. Isto deve ser feito com o comando interface:interface( plotdevice = ps, plotoutput = "c:/tmp/graf1.ps");plot( sin, -2..2); O gr\341fico do \372ltimo comando foi enviado para o arquivo graf1.ps, e pode ser impresso numa impressora PostScript. Uma maneira alternativa de enviar gr\341ficos para um arquivo \351 usando o comando plotsetup. Vamos mostrar mais um exemplo, mas nesse caso vamos tirar a caixa retangular que o Maple coloca no gr\341fico enviado para o arquivo, e vamos apresent\341-lo na orienta\347\343o usual (portrait em vez de landscape que \351 o default)plotsetup(ps,plotoutput="c:/tmp/graf1.ps",plotoptions=`portrait,noborder`);Para voltar a mostrar o gr\341fico na worksheet novamente, o valor de plotdevice deve ser modificado para inline ou win:interface( plotdevice = inline);Para imprimir gr\341ficos em outros formatos, veja o help on line de plot,device e interface.CriptografiaElGamalExemplo ElGamal com Matrizwith(LinearAlgebra):g:=nextprime(27);
a:=Matrix([[1,2],[3,4]]);
Determinant(a) mod g;
igcd(%,g);
n:=5;
b:=map(x->x mod g,evalm(a**5)); # envia a e bw:=Matrix([[12,14],[03,03]]);
Determinant(w) mod g;
igcd(%,g);
k:=3;
y:=a**k;
z:=map(x->x mod g,evalm(w.(b**k))); # envia y e zmap(x->x mod g,evalm(z.(y**(-n))));Elgamal sobre NiMmSSJaRzYiNiNJInBHRiU=p := nextprime(10^9);
ceil(evalf(log[10](p)));
randomico := rand(1..p):a := randomico();
n := randomico();
b := a &^ n mod p; # envia p,a e bw := 12140303;
ceil(evalf(log[10](w)));
k := randomico();
y := a &^ k mod p;
z := w * (b &^ k) mod p;z*(y &^ (-n)) mod p;
z*(y &^ ((p-1)-n)) mod p;Curvas El\355pticasLinks interessantes:http://www.certicom.com/index.php?action=ecc_tutorial,ecc_tut_2_3http://www.certicom.com/index.php?action=ecc_tutorial,ecc_tut_3_3http://www-fs.informatik.uni-tuebingen.de/~reinhard/krypto/English/4.4.en.htmlrestart: with(numtheory): with(plots): plot(x^3-10*x-7,x=-5..5,y=-20..20);implicitplot(y^2=x^3-10*x-7,x=-10..10,y=-10..10,grid=[72,72]);e := x-> evalf(sqrt(x^3-10*x-7)):curve:=implicitplot(y^2=x^3-10*x-7,x=-10..10,y=-10..10,grid=[72,72]):points:=pointplot([[4.36,e(4.36)],[4.36,-e(4.36)]],color=black):lines:=implicitplot({x=4.35},x=-3..6,y=-10..10,color=blue,grid=[72,72]):text:=textplot({[4.0,6.3,`P`],[3.7,-6,`-P`],[4.1,10,`O`]},font=[TIMES,ITALIC,12]):display(curve,points,lines,text);curve:=implicitplot(y^2=x^3-10*x-7,x=-10..10,y=-10..10,grid=[72,72]):points:=pointplot([[-2.5,e(-2.5)],[-1.5,e(-1.5)],[4.36,e(4.36)],[4.36,-e(4.36)]],color=black):lines:=implicitplot({y-e(-2.5)=(e(-1.5)-e(-2.5))/(1)*(x+2.5),x=4.35},x=-3..6,y=-10..10,color=blue,grid=[72,72]):text:=textplot({[-2.7,2.5,`P`],[-1.4,3.3,`Q`],[4.0,6.3,`R`],[3.8,-6,`P+Q`],[4.1,10,`O`]},font=[TIMES,ITALIC,12]):display(curve,points,lines,text);restart;p3mod4 := proc(s) ## Resido Quadr\341tico e Soma de dois quadrados local t; t := nextprime(s); while t mod 4 <> 3 do t := nextprime(t); od: RETURN(t);end:eqn := x^3 + c*x + d:Gera o conjunto de pontos da curvaepoints := proc(ec, x, ub, p)
local ecurve, z, pct, k, i;
pct := 0;
for k from 0 to p-1 while pct <= ub do
z := subs(x=k, ec) mod p;
if z = 0 then
pct := pct + 1;
ecurve[pct] := [k, z];
fi:
if z &^ ((p-1)/2) mod p = 1 then
z := z &^ ((p+1)/4) mod p;
ecurve[pct+1] := [k, z];
ecurve[pct+2] := [k, -z mod p];
pct := pct + 2;
fi:
od:
if pct > ub then
pct := ub:
fi:
seq(ecurve[i], i = 1..pct):
end:Soma dois pontos da curvaaddec := proc(le, re, c, p)
local i, cle, cre, lambda, res, x3, y3;
cle := le mod p;
cre := re mod p;
if cle = 0 or cre = 0 then
res := cle + cre;
elif cle[1] = cre[1] and cle[2] = -cre[2] mod p then
res := 0;
else
if cle[1] = cre[1] mod p and cle[2] = cre[2] mod p
then
lambda := ((3*cle[1]^2+c)/2/cle[2]) mod p;
else
lambda := (cre[2]-cle[2])/(cre[1]-cle[1]) mod p;
fi:
x3 := (lambda^2-cle[1]-cre[1]) mod p;
y3 := (lambda*(cle[1]-x3)-cle[2]) mod p;
res := [x3, y3];
fi:
res;
end:ElGamal para curvas Elipticaselgamal := proc(alpha, e, c, p)
local calpha, n, y;
calpha := alpha;
n := e;
y := 0;
while n > 0 do
if irem(n, 2, 'n') = 1 then
y := addec(calpha, y, c, p):
fi:
calpha := addec(calpha, calpha, c, p):
od:
y;
end:c := 3;d := 7;Verifica se n\343o tem raizp:=p3mod4(21);4*c^3 + 27*d^2 mod p;ecurve := epoints(eqn, x, infinity, 23);ecurve := ecurve, 0;nops([ecurve]);addec([1, 3], [7, 16],c,p);addec([1, 3], [1, 20],c,p);p := p3mod4(220532496293778805);c := 3:d := 7:Verifica se n\343o tem raiz4*c^3 + 27*d^2 mod p;a := epoints(eqn, x, 1, p);n := 91530873521338:b := elgamal(a, n, c, p);k := 431235145514:y := elgamal(a, k, c, p);kb := elgamal(b, k, c, p);with(StringTools):alfabeto:=cat(" ",Iota("A".."Z"));msg:="CRIPTOGRAFIA";length(msg);ceil(evalf(log[10](p)));msg:=map(x->Search(x,alfabeto)-1,Explode(msg));w := [0318091620, 15071801060901]:z := [ kb[1]*w[1] mod p, kb[2]*w[2] mod p ];ny := elgamal(y, n, c, p);[ (ny[1]^(-1)*z[1]) mod p, (ny[2]^(-1)*z[2]) mod p ];msg := [3, 18, 9, 16, 20, 15, 7, 18, 1, 6, 9, 1]; msg:=map(x->alfabeto[x+1],msg);Implode(msg);Exerc\355cioCriptografe a frase de Mario Henrique Simonsen, "Estrat\351gico n\343o \351 mais o petr\363leo, a energia, o telefone ou o asfalto. Estrat\351gico \351 investir em gente: educa\347\343o, sa\372de e seguran\347a." com os m\351todos desta aula.