Advertisement
arkanon

primo

May 3rd, 2013
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 1.26 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # primo
  4. #   Testa a primalidade de um inteiro.
  5. #   Se nao for quadrado perfeito nem divisivel por 2, 3 ou 5, apresenta a fatoracao prima do numero.
  6. #
  7. # Arkanon <arkanon@lsd.org.br>
  8. # 2013/05/03 (Sex) 14:08:34 (BRS)
  9.  
  10. if [ $# = 0 ]
  11. then
  12.   echo "Use: $(basename $0) <numero inteiro>"
  13.   exit
  14. fi
  15.  
  16. n=$1
  17.  
  18. [ ${n#${n%?}} = 5 ]                   && divisor=5
  19. [ $[($(sed 's/./+&/g'<<<$n))%3] = 0 ] && divisor=3
  20. echo "02468" | grep -q ${n#${n%?}}    && divisor=2
  21.  
  22. export BC_LINE_LENGTH=0
  23.  
  24.               out=$(bc<<<"r=sqrt($n);scale=100;r==sqrt($n);r")
  25. quadrado_perfeito=$(echo "$out" | head -n1)
  26.     raiz_quadrada=$(echo "$out" | tail -n1)
  27.  
  28. [ $quadrado_perfeito == 1 ] && divisor=$raiz_quadrada
  29.  
  30. if [ "$divisor" ]
  31. then
  32.   [ $quadrado_perfeito == 1 ] && echo "quadrado perfeito"
  33.   echo "divisivel por $divisor"
  34.   exit
  35. fi
  36.  
  37. # tem chance de ser primo
  38. echo "testando divisores impares de $n entre 7 e $raiz_quadrada"
  39.  
  40. divisor=7
  41. while (( divisor < raiz_quadrada ))
  42. do
  43. # echo "$divisor .. $raiz_quadrada"
  44.   [ $((n%divisor)) = 0 ] && break || ((divisor+=2))
  45. done
  46.  
  47. if (( raiz_quadrada - divisor > 1 ))
  48. then
  49.   quociente=$((n/divisor))
  50.   $0 $quociente
  51.   echo "$n: divisivel por $divisor. Quociente: $quociente"
  52. else
  53.   echo "$n: primo"
  54. fi
  55.  
  56. # EOF
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement