За последние 24 часа нас посетили 22849 программистов и 1237 роботов. Сейчас ищут 738 программистов ...

Функция проверки числа на простоту (Шлосснейгл "продвинутый" PHP)

Тема в разделе "PHP для новичков", создана пользователем Таська, 21 сен 2018.

Метки:
  1. Таська

    Таська Новичок

    С нами с:
    21 сен 2018
    Сообщения:
    15
    Симпатии:
    0
    В данный момент читаю книгу Шлосснейгла (да-да, я в курсе, какого она года) и вижу такой код проверки числа на простоту:

    PHP:
    1. function is_prime($number) {
    2.  
    3.     if(($number % 2) != 0) {
    4.       return true;
    5.     }
    6.     for($i=0; $i < $number; $i++) {
    7.       // A cheap check to see if $i is even
    8.       if( ($i & 1) == 0 ) {
    9.         continue;
    10.       }    
    11.       if ( ($number % $i ) == 0) {
    12.         return false;
    13.       }
    14.     }
    15.     return true;
    16.   }
    По его логике, если число делится на 2 с остатком оно простое? У него там с головой все в порядке? Проверяем

    PHP:
    1. $p = is_prime(9);
    Получаем bool(true). Это что вообще такое?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Это либо автор был пьян, либо переводчик и редактор российского издания были пьяны.
    Книги пишут люди. Если что-то напечатано, оно не становится истиной в последней инстанции и несет никаких гарантий не бредовости содержания.
     
  3. Таська

    Таська Новичок

    С нами с:
    21 сен 2018
    Сообщения:
    15
    Симпатии:
    0
    Это в оригинале. И что, что пьян? Это не какая-то случайная ошибка, типа под пивасом перепутал в JS поля и вместо adress прописал address, это буквальное незнание самых основ.

    Мало того, он этот код продублировал 2 раза, через for (то, что я привел) и через while. И там такое уже условие! Мало того, если ты проверил число на остаток от 2, нафига его на четность проверять, да еще и битовым оператором? Если оно было нечетное, так уже return вылетел, и дальше код не выполняется.

    [​IMG]
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Таська, просто эта функция для проверки четности числа, а не его "простоты". К тому-же это пример того, как не надо делать эту проверку (четности числа), используя цикл while.
     
  5. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    вывод - надо читать не только код, но и текст его окружающий )
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Чукча не читатель.
     
  7. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    Что такой код корявый - автора можно понять. Пример автором выбран неудачный. Он себе мозг выел переделывая код многократно. Наверняка в самом начале стояла проверка на четность:
    PHP:
    1. if(($number % 2) == 0) {
    2.     return false;
    3. }
    которую он решил перевернуть (2 - тоже простое число) в самом конце написания примера, когда мозг уже кипел. От того и получился такой код.
     
    #7 Maputo, 21 сен 2018
    Последнее редактирование: 21 сен 2018
  8. Таська

    Таська Новичок

    С нами с:
    21 сен 2018
    Сообщения:
    15
    Симпатии:
    0
    Да ну? prime1.png

    У тя со зрением плохо или просто MGIMO FINISHED?
    eyes.png
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    Прежде чем выводы такие делать, изучи сначала основы, либо обосраться так на глазах у всех можно.
    Имя функции своей можно по разному задать, хоть и:
    PHP:
    1. function you_nub ( ... ) {}
    а логическое действие будет выполняться совсем с другим смыслом
     
  10. Таська

    Таська Новичок

    С нами с:
    21 сен 2018
    Сообщения:
    15
    Симпатии:
    0
    Можно, конечно, еще можно с 9-го этажа вниз головой прыгнуть. Какой смысл в этом?
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    Хорошо. Какой смысл ты живешь, планету засоряешь, после сдохнешь ?
     
  12. Таська

    Таська Новичок

    С нами с:
    21 сен 2018
    Сообщения:
    15
    Симпатии:
    0
    Ало, дурак! Ты в своему уме?
    Какой смысл в том, чтобы называть функцию не так, что она делает? Ты совсем дурак?
     
  13. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @Таська, @MouseZver вместо того, чтобы спорить о названии функции - предложите свою реализацию на php для небольших чисел. Скажем, до 1000.
     
    Dimon2x нравится это.
  14. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    @Таська как дите малое ноешь "в чем смысл". Я тебе олень тупой еще раз продиктую: любое название хоть в мд5 хеше назови, это ни как не повлияет на логику / содержимое / изменение данных. Тут дело не в смысловой нагрузке. А поверхностное понимание "что делает этот рычах / педаль"
    Ты баба совсем безмозглая или тупую детскую дуру врубила "не хочу это слышать но хочу чтобы мне доказали".

    Пошла накуй тогда учить основы.
    --- Добавлено ---
    @Maputo смысл, если это существо фиг понимает, читая тонны книжек
     
    #14 MouseZver, 22 сен 2018
    Последнее редактирование: 22 сен 2018
  15. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @MouseZver, судя по комментариям у вас обоих запала хватит не на одну такую функцию - почему бы не потратить силы на кусочек кода?
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    Maputo нравится это.
  17. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @MouseZver, этот комментарий мне нравится больше, чем предыдущие - особенно скриншот. +1
     
  18. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Если все еще актуален вопрос проверки числа на простоту, то для проверки одного числа на простоту сгодится и такой код:


    PHP:
    1. function is_prime($hu)
    2. {
    3. $hh=pow($hu,0.5);
    4. for($i=0 ; $i<$hh ; $i++) if ($hu%$i==0) return false;
    5. return true;
    6. }
     
  19. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @mirosas, почему переменная цикла начинается с нуля?
     
    mirosas нравится это.
  20. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Потому что этот код был написан за 2 минуты, не тестировался, и даже не запускался. С двойки надо начинать, верно подметили.
     
    Maputo нравится это.
  21. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @mirosas еще бы исключить из проверки отрицательные и 0, 1, 2
     
    mirosas нравится это.
  22. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
  23. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    ))) сколько ошибок то)). 0,1, отрицательные понятно.. Двойка то чем не угодила?

    PHP:
    1. function is_prime($hu)
    2. {
    3. if (!is_int($hu)) return false;
    4. if ($hu<2) return false;
    5. $hh=(int)(pow($hu,0.5));
    6. for($i=2 ; $i<=$hh ; $i++) if ($hu%$i==0) return false;
    7. return true;
    8. }
     
    #23 mirosas, 22 сен 2018
    Последнее редактирование: 22 сен 2018
    Maputo нравится это.
  24. Maputo

    Maputo Активный пользователь

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    С двойкой я маху дал))) Просто среди простых чисел она выделяется)))
     
  25. mirosas

    mirosas Активный пользователь

    С нами с:
    17 июл 2015
    Сообщения:
    235
    Симпатии:
    5
    Как самое маленькое простое число))).