Juros Simples

Você me emprestaria R\$ 2000,00 agora para eu te devolver daqui 1 ano? Bom, provavelmente você deve ter parado para pensar um pouco a respeito, e, talvez levado em consideração alguns fatores, como por exemplo, risco de cŕedito, inflação, custo de oportunidade e remuneração. Esses fatores levam em consideração, respectivamente, aos seguintes fatos: Será que o pagamento será efetuado? Aquela bike que você pretende comprar agora, vai dar pra comprar daqui um ano? O que você deixou de fazer nesse período? Será que não é melhor receber um rendimento extra sobre esse valor? Todas essas perguntas estão interligadas a um conceito: Juros. Como eu sempre digo pros meus amigos, o Juro é traiçoeiro, por vezes ele é seu amigo, por vezes, seu inimigo, depende de com quem ele está andando. Neste caso, aplicar uma taxa de juros pode te beneficiar, mas aí vem a pergunta: Qual regime de capitalização devo aplicar? Simples ou Composto?

Criptografia básica com Matrizes

Definimos uma matriz como sendo um tabela ou arranjo que simplificam e por vezes representam sistemas lineares. São ferramentas muito importantes para quem deseja seguir as carreiras de Ciências Exatas. Com o intuíto de motivar um pouquinho o estudo de matrizes, principalmente se você é estudante de ensino médio, irei mostrar à você como desenvolver uma criptografia básica com matrizes e implementar em Julia Lang, uma linguagem de programação de alto nível que está encantando os matemáticos aplicados.

Requisitos: Multiplicação Matricial e Matriz Inversa.

Basicamente, teremos o trabalho de resolver um sistema linear do tipo $Ax=b$, onde iremos denominar $A=(a_{ij})_{m\times n}$ como sendo a Matriz Chave, ou seja, como o nome já diz, será a matriz que irá criptografar ou descriptografar uma mensagem. O vetor, ou matriz $x=(x_{ij})_{n\times p}$ é onde serão inserido os dados para criptografar. Ao realizarmos a multiplicação matricial $Ax$, teremos como retorno uma matriz $b=(b_{ij})_{m\ p}$ que terá a nossa mensagem criptografada. Agora, vamos supor que você recebeu uma mensagem e deseja descriptografar, você recebeu a chave e recebeu a mensagem criptografada, como descriptografar?

Note que, tudo que fizemos foi basicamente resolver uma equação $Ax=b$ onde $A$ e $x$ eram conhecidos, agora, conhecidos as matriz $A$ e $b$, como encontrar $x$ que é a mensagem descriptografada? Para quem já cursou Álgebra Linear a resposta pode parecer trivial, como esse conteúdo é voltado para um estudante do ensino médio, vamos entrar em detalhes.

Lembrando do fato de que as operações matricial formam o que chamamos de "Anel", isto é, preserva algumas operações usuais porém, nem sempre é comutativo, ou seja, nem sempre fazer $AB=BA$. Um contra exemplo disto: Basta pegar uma matriz $A=(a_{ij})_{m\times p}$ e uma matriz $B=(b_{ij})_{p\times n}$, a multiplicação $AB$ gera uma matriz $C=(c_{ij})_{m \times n}=\sum_{j=1}^{n}a_{ij}b_{jk}$, note que para se fazer uma multiplicação matricial $AB$ o número de colunas da matriz $A$ deve ser o mesmo que o número de linhas da matriz $B$. No caso, se $i\neq j$, a multiplicação $BA$ é impossível, o que já é um contra-exemplo de comutação. Outros contra-exemplos de comutação podem ser facilmente encontrados. Enfim, o que importa é que, $Ax$ por vezes é diferente de $xA$ em nosso exemplo, por isso, atento à ordem das multiplicações.

No caso, para resolvermos $Ax=b$ para $x$, multiplicamos a inversa da matriz $A$, que será denotada por $A^{-1}$ em ambos os lados. A multiplicação $AA^{-1}=A^{-1}A=I_{n}$ (se a matriz $A$ for invertível, ou seja, em termos de Álgebra Linear, não-singular). Logo, temos:

$Ax=b \therefore A^{-1}Ax=A^{-1}b \therefore I_{n}x=A^{-1}b \therefore x = A^{-1}b$

No caso, essa relação irá descriptografar a nossa mensagem. Talvez uma coisa entediante a se fazer seja inverter a matriz $A$, mas, na vida real, no dia-a-dia fora da escola, dificilmente inversões de matrizes são feitas à mão, agradecemos hoje aos computadores pela eficiência nos cálculos. Sendo assim, você pode utilizar uma linguagem de programação ou simplesmente usar uma calculadora de matriz inversa online para te auxiliar. Antes de programar, acompanhe o exemplo à seguir para entender melhor a teoria que foi desenvolvida:

Em meu exemplo, eu vou escolher a seguinte matriz para representar a chave:

$A=\left[\begin{array}{c c}1 & 2\\3 & 4\end{array}\right]$

Como eu sou uma pessoa muito criativa, irei representar $A=1$, $B=2$, $C=3$, $\cdots$ e assim por diante. Suponha que eu queira criptografar a palavra "batata", temos então, que, no modelo que prôpus, em números batata = $2\;\;\;1\;\;\;20\;\;\;1\;\;\;20\;\;\;1$. Assim, posso armazenar estes valores na matriz $x$ da seguinte forma:

$x = \left[\begin{array}{c c c}2 & 20 & 20\\1 & 1 & 1\end{array}\right]$

Agora, basta apenas fazermos a multiplicação $Ax=b$. No caso, geramos a seguinte relação:

$\left[\begin{array}{c c}1 & 2\\3 & 4\end{array}\right]\left[\begin{array}{c c c}2 & 20 & 20\\1 & 1 & 1\end{array}\right]=\left[\begin{array}{c c c}4&22&22\\10&64&64\end{array}\right]$

Que é a nossa mensagem criptografada. Logo, se quiser que alguém desvende a nossa mensagem, enviamos a matriz $b = Ax$ e a matriz chave $A$. Assim, para descriptografar, como visto na teoria, basta resolvermos para $x$ o sistema $Ax=b$, no caso, $x = A^{-1}b$. Calculando rapidamente em Julia Lang, obtemos que:

$A^{-1}=\left[\begin{array}{c c}-2 & 1\\\frac{3}{2} & -\frac{1}{2}\end{array}\right]$

Assim, temos que:

$x=\left[\begin{array}{c c}-2 & 1\\\frac{3}{2} & -\frac{1}{2}\end{array}\right]\left[\begin{array}{c c c}4&22&22\\10&64&64\end{array}\right]=\left[\begin{array}{c c c}2&20&20\\1&1&1\end{array}\right]$

Ou seja, note que de fato, ao efetuarmos a multiplicação, que $x$ satisfaz o valor que inserimos para criptografar. Bom, apesar deste modo de criptografia ser bastante simples, ainda é assim é uma criptografia difícil de se quebrar caso não tenha a chave. Levaria anos para que se possa descobrir a chave a ser descriptografada, como usamos uma "matriz chave" meio que trivial, poderia ser quebrada facilmente, mas se criásse-mos uma chave do tipo:

$A=\left[\begin{array}{c c}1023 & 2018\\8398 & 1997\end{array}\right]$

Levaria muito, mas, muito tempo para descriptografar.

Agora que já vimos a teoria e um exemplo, vamos aplicar isso com programação. No caso, irei ensinar como fazer as mesmas operações utilizando a linguagem Julia. Você pode baixar a linguagem Julia através do site oficial ou simplesmente, utilizar a interface Jupyter, que possibilita também programar em Julia online sem a necessidade de efetuar download.

Seguindo o exemplo, temos então que a Matriz $A=(a_{ij})_{2\times 2}$
A = [1 2; 3 4]
2×2 Array{Int64,2}:
 1  2
 3  4
Criamos agora a matrix $x=(x_{ij})_{2\times 3}$.
x = [2 20 20; 1 1 1]
2×3 Array{Int64,2}:
 2  20  20
 1   1   1
Resolvemos agora o sistema $Ax=b$, no caso, em Julia Lang:
B = A*x
2×3 Array{Int64,2}:
  4  22  22
 10  64  64
Pronto, agora já temos a nossa mensagem criptografada. Para descritografar, basta resolver para $x$ o sistema $Ax=b$. Em Julia Lang, basta utilizarmos o comando: A\b. No caso:
x = A\B
2×3 Array{Float64,2}:
 2.0  20.0  20.0
 1.0   1.0   1.0
Esse é o básico para resolver sistemas lineares através do Julia. Claro que, você pode ser criativo e criar um "descriptografador". No caso, utilizando o raciocínio que segui no exemplo, eu criei um vetor $z$ qualquer, da seguinte forma:
z = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l, :m, :n, :o, :p, :q, :r, :s, :t, :u, :v, :w, :x, :y, :z, :?, :!, :_]
Em Julia, :a significa que você está inserindo uma variável do tipo string. Após criar esse vetor com os caracteres, criei uma função chamada "descripto" que fara todo o trabalho para mim, no caso:
function descripto(x::Array)
    for j=1:length(x[1,:])
        for i=1:length(x[:,1])
            k = round(Int, x[i,j])
            print(z[k])
        end
    end
end
Entrada: descripto(x)
Saída: batata
Pronto! Agora você já pode sair criptografando e descriptografando mensagens à vontade!

Referências:
[1] Julia Lang. www.julialang.org

Comments

Popular posts from this blog

Juros Simples