The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Разработчики PHP предложили P++, диалект со строгой типизаци..."
Отправлено Аноним84701, 19-Авг-19 22:09 
> Если корень из (a^2+b^2)/(ab+1) дает целое число, то вывести его, если не
> целое то не выводить.
> На баше скажем, с вызовом внешних софтин была одна скорость, потом я
> переписал его на си (как сумел) - получил скорость в 10000
> выше.

Что-то уж слишком.


% cat testsq.py&&time pypy testsq.py 10000
import sys, math

to_max = int(sys.argv[1])
for a in range(1, to_max):
    for b in range(a, to_max):
        ab = a*b+1
        sq = a*a + b*b
        mod_res = sq % ab
        if (mod_res == 0):
            div_res = sq / ab
            sqrt = math.sqrt(div_res)
            if sqrt == math.floor(sqrt):
                print(a,b)(1, 1)
(2, 8)
(3, 27)
...
(418, 1560)
(1560, 5822)
pypy testsq.py 10000  1,64s user 0,03s system 99% cpu 1,677 total


vs.

% cat square.c && gcc -Ofast square.c -o square -lm && time ./square 10000
#include <stdio.h>
#include <math.h>
int main(int argc, char** argv) {
    unsigned int max = atoi(argv[1]);
    unsigned int a, b, sq, ab, mod_res, div_res, sqrt_res;
    for (a = 1; a < max; a++) {
        for (b = a; b < max; b++) {
            sq = a*a + b*b;
            ab = a*b + 1;
            mod_res = sq % ab;

            if (!mod_res) {
                // да, я в курсе что целочисленные % и / будет одна операция
                div_res = sq / ab;
                sqrt_res = sqrt(div_res);
                if (sqrt_res  == floor(sqrt_res))
                  printf("%u/%u \n",a,b);
            }
        }
    }
    return 0;
...
./square 10000  0,47s user 0,00s system 99% cpu 0,477 total

ЗЫ: не, можно конечно использовать интринсики/SIMD, но это уже будет другой "класс" программ.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру