2016-12-15 7 views
1

Вот мой сценарий:Не работает ли мой скрипт проверки подлинности bash?

#!/usr/bin/env bash 

#for checking whether given number is prime or not 

#typeset -i NUMBER 
NUMBER=$1 

if (($NUMBER <= 1));then 
echo "A prime number must be greater than 1!" 
    exit 0 
fi 

if (($NUMBER == 2 || $NUMBER == 3));then 
    echo "$NUMBER is a PRIME number." 
    exit 0 
fi 

check=$(((($NUMBER**2)+17)%12)) 
if (($check == 6));then 
    echo "$NUMBER is a PRIME number." 
else 
    echo "$NUMBER is not a PRIME number." 
fi 

exit 0 

Обычно это работает, но смотреть на это:

./prime2 12345765498743607656323978968565589876654541139797868554123589679789867896789789789789789789897789 

A prime number must be greater than 1! 

Кажется, что число доказыванию не будет интерпретировать в правильном направлении. Любые подсказки?

+0

Число больше, чем допустимое целое число в оболочке Bourne. Bash пытается проклинать числа за пределами '(2^31) -1' или' (2^63) -1', в зависимости от вашей архитектуры – Inian

+0

Ваша простая проверка числа не работает. Рассмотрим _n_ = 25. Ваша формула принимает 25 ** 2, которая равна 625, добавляет 17 для получения 642 и принимает модуль с 12, что равно 6, поэтому вы сообщаете, что 25 = 5 * 5 является простым, что неверно. – user448810

+0

@ user448810 Правильно .... я должен просмотреть мой код! Спасибо. – RELiABLE

ответ

2

Причина связана с целым переполнением, возникающим из максимального положительного целого, которое может поддерживать ваша система. Числа за пределами (2^31)-1 или (2^63)-1 на 32-bit и 64-bit начинают иметь отрицательные значения по этой причине.

Проверьте поведение на моем Mac, а 64-bit машину

dudeOnMac: ~$ uname -a 
Darwin dudeOnMac 14.5.0 Darwin Kernel Version 14.5.0: Sun Sep 25 22:07:15 PDT 2016; root:xnu-2782.50.9~1/RELEASE_X86_64 x86_64 

dudeOnMac: ~$ ((number=(2**63)-1)); echo $number 
9223372036854775807 
dudeOnMac: ~$ ((number++)); echo $number 
-9223372036854775808 

и странный номер, который вы предоставили в вашем входе

dudeOnMac: ~$ number=12345765498743607656323978968565589876654541139797868554123589679789867896789789789789789789897789 

Посмотрите на то, что происходит, когда я пытаюсь увеличить его,

dudeOnMac: ~$ ((number++)); echo $number 
-398770938935753666 

Таким образом, состояние if (($NUMBER <= 1)) в вас r скрипт, очевидно, будет true в вашем скрипте.

Вы можете, конечно, проверить функциональность своего скрипта до максимально допустимых целочисленных значений в зависимости от вашей системной архитектуры.

+0

Эй, Иниан, большое спасибо за ваше объяснение! Я понимаю, что невозможно проверить, что такие высокие числа являются чистыми или нет на обычных 64-битных машинах Linux. Или это способ сделать это? – RELiABLE

+0

@ REELIABLE: вы можете проверить максимально допустимый номер в зависимости от вашей архитектуры. например на 64-битной машине '9223372036854775807' – Inian

+0

Хорошо .... но посмотрите, это работает на моей 64-битной машине: ./prime2 885685678978956689568967497686678954768978977867868767866 8856856789789566895689674976896789547689789778678687767676866 не является ПРАВОЕ число. – RELiABLE