Nessa edição do diário de bordo, eu pretendo mostrar alguns algoritmos de divisibilidade em shell script.
A aritmética está presente em diversas aplicações tanto matemáticas quanto da própria ciência da computação. Ela encontra aplicações, por exemplo na criptografia RSA, que falaremos em breve.
1. Calculando o resto da divisão em shell script
O primeiro script que eu gostaria de compartilhar com vocês faz algo bastante simples, calcula o resto da divisão de um número natural pelos seus antecessores naturais.
#!/bin/bash
numero=$1
for((divisor=1; divisor< numero; divisor++)); do
echo "$(($numero % $divisor))
"
done
Esse tipo de cálculo que lida com os restos da divisão de um número natural por outro é bastante importante na aritmética modular e na teoria dos grupos Agora vamos ver outros algoritmos de divisiblidade com Shell script:
2. Calculando os divisores de um número natural em shell
Nessa segunda etapa do código, eu estruturei o mesmo em funções. Elaborei uma função chamada numero_divisores, que lista todos os divisores do número natural dado e, em seguida diz quantos divisores naturais ele tem.
numero_divisores(){
local numero=$1
for ((divisor = 1; divisor <= numero; divisor++)); do
if [ $((numero % divisor)) -eq 0 ]; then
echo "$divisor "
contador=$((contador + 1))
fi
done
echo "Número de divisores: $contador"
}
Uma outra função criada foi a função e_primo. Esta função faz uso de um laço for de 1 até o inteiro menor do que a raiz quadrada do núnero dado e calcula o resto da divisão desse número por cada um desses divisores. Se esse resto da divisão for zero para mais de dois casos, então esse número não é primo e a função retorna 1. Se as condições dos restos das divisões forem satisfeitas para que o número dado seja primo, a função retorna 0 (true). Veja o trecho de código:
# Implementa a função e_primo, que verifica se um número natural dado é primo a partir do algoritmo do crivo de Eratóstenes
e_primo(){
local num=$1
local dividendo
# 0 e 1 não são primos
if[ $num -eq 0 ]; then
echo "false"
fi
if[ $num -eq 1 ]; then
echo "false"
fi
for (( i = 1; i*i <= $1; i ++ )); do
if [ $(($1 % i)) -eq 0 ]; then
return 1
else
return 0
fi
done
}
E, finalmente, o código completo ficou assim:
#!/bin/bash
clear
# Variáveis globais
numero=$1
contador=0
# Implementa a função número de divisores - Esta função recebe um número natural, lista quais são os seus divisores e retorna o número de divisores naturais desse número
numero_divisores(){
local numero=$1
for ((divisor = 1; divisor <= numero; divisor++)); do
if [ $((numero % divisor)) -eq 0 ]; then
echo "$divisor "
contador=$((contador + 1))
fi
done
echo "Número de divisores: $contador"
}
# Implementa a função e_primo, que verifica se um número natural dado é primo a partir do algoritmo do crivo de Eratóstenes
e_primo(){
local num=$1
local dividendo
# 0 e 1 não são primos
if[ $num -eq 0 ]; then
echo "false"
fi
if[ $num -eq 1 ]; then
echo "false"
fi
for (( i = 1; i*i <= $1; i ++ )); do
if [ $(($1 % i)) -eq 0 ]; then
return 1
else
return 0
fi
done
}
#numero_divisores $numero
numero_divisores $numero
if e_primo $1; then
echo "é primo"
else
echo "não é primo"
fi
Em breve, poderei inserir mais funções nesse código, permitindo que ele realize mais operações aritméticas. Fica ainda como sugestões de códigos que eu já criei mas ainda não postei aqui, o cálculo do mmc e do mdc. Trarei isso em breve aqui no blog.
Espero que gostem. Até a próxima.