Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
3 / 2 / 1
Регистрация: 10.03.2019
Сообщений: 51

Очень долгий подсчёт данных, возможно застрял в цикле. Нужна оптимизация

21.03.2022, 03:30. Показов 642. Ответов 4

Студворк — интернет-сервис помощи студентам
Всем привет, есть 3 метода. Первый принимает длину возвращаемой строки, выводит случайную последовательность нулей и единиц. Второй переводит эту строку в десятичный вид. Третий метод определяет простое ли число. При небольших значениях size, где-то 16 считает примерно за 2 секунды, что уже медленно. Я вбивал 32, но так и не дождался процесса подсчёта.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        public string BinGen(int size)//генерирует случайное двоичное число заданной длины
        {
            int[] binArray = new int[size]; binArray[0] = 1; binArray[size - 1] = 1;
            for (int i = 1; i < binArray.Length - 1; i++)
            {
                binArray[i] = new Random().Next(0, 2);
                Thread.Sleep(1);
            }
            string binaryString = String.Concat<int>(binArray);//сцепляет элементы массива в строку
            return binaryString;
        }
        public BigInteger BinToDec(string str)//переводит число из 2-й СС в 10-ю
        {
            BigInteger decNum = 0;
            for (int i = 0; i < str.Length; i++)
            {
                if(str[i] != '0')
                    decNum += ((int)str[i] - 48) * BigInteger.Pow(2, str.Length - i - 1);//-48 потому что он через жопу переводит "1" из аски как 49
            }
            return decNum;
        }
        public bool isPrime(BigInteger number)//проверяет простое ли число
        {
            for (int i = 2; i < number; i++)
            {
                if (number % i == 0)
                    return false;
            }
            return true;
        }
            private void button1_Click(object sender, EventArgs e) 
           {
            string s = BinGen(16);
            BigInteger n = BinToDec(s);
            while(isPrime(n) == false)
            {
                s = BinGen(16);
                n = BinToDec(s);
            }
            richTextBox1.Text = Convert.ToString(n);
            richTextBox2.Text = s;
            }
Мне же нужно рассчитать простое число длинной 128, 256 и 512 бит. Я уже смекаю, что код не оптимизирован. Пытался генерировать случайное число длинной 128 бит и прибавлять единицу(n++) пока оно не станет простым, но из цикла, как я понял, так и не вышел.

Добавлено через 17 минут
Если просто генерировать 128 битное число, то все ок. Значит проблема в проверке числа на простоту. Ну да, только сейчас задумался, что в методе isPrime пробегаю от 2х до number. Может быть кто-то знает более быстрый алгоритм для проверки простоты числа?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2022, 03:30
Ответы с готовыми решениями:

Очень долгий процесс (оптимизация)
Доброго времени суток, форумчане! Есть такой цикл: await Task.Run(() =&gt; { for (int i = start; i...

Телефон застрял в загрузочном цикле
Телефон застрял в загрузочном цикле. Модель телефона Xiaomi Pocophone F1. Делал принудительную перезагрузку. Срок гарантии прошел. В...

Застрял в цикле. Глупая сортировка матрицы
Было дано задание. Отсортировать строки матрицы по сумме их элементов. Написал такую программу, основанную на методе &quot;глупой...

4
3 / 2 / 1
Регистрация: 10.03.2019
Сообщений: 51
21.03.2022, 14:00  [ТС]
Жесть, мужики, не знаю правда ли это работает для всех простых чисел больших 3. Но все простые числа, которые я проверил удовлетворили этому условию. В чем суть: При возведении простого числа в квадрат , остаток от деления квадрата этого простого числа на 24 дает единицу. Например 72 mod 24 = 1 - значит 7 простое число. Если кому не сложно скинуть ресурс, который это подтверждает, хотелось бы найти какое-нибудь доказательство. На слово верить не сильно хочется, ведь числа, которые я проверяю на простоту длинной от 128 до 512 бит.
C#
1
2
3
4
5
6
        public bool isPrime(BigInteger number)//проверяет простое ли число
        {
            if (BigInteger.Pow(number, 2) % 24 == 1)
                return true;
        return false;
        }
0
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
21.03.2022, 15:03
На википедии

Нечётное число p, не кратное 3, равно 1 или 2 по модулю 3 и равно 1, 3, 5 или 7 по модулю 8. При возведении в квадрат это даёт 1 по модулю 3 и 1 по модулю 8. Вычитая 1, получаем 0 по модулю 3 и 0 по модулю 8. Следовательно, https://www.cyberforum.ru/cgi-bin/latex.cgi?p^{2}-1 кратно 3 и кратно 8; следовательно, оно кратно 24
1
3 / 2 / 1
Регистрация: 10.03.2019
Сообщений: 51
22.03.2022, 13:28  [ТС]
План провалился. Да, квадрат простого числа дает в остатке от деления на 24 единицу. Но, кто бы мог подумать, есть и не простые числа, удовлетворяющие этому условию. Может кто знает быструю реализацию проверки числа на простоту, кроме перебора делителей до n.
0
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
22.03.2022, 13:57
Цитата Сообщение от xtronix Посмотреть сообщение
кроме перебора делителей до n.
Перебор до https://www.cyberforum.ru/cgi-bin/latex.cgi? sqrt{n}?
Читайте, вникайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2022, 13:57
Помогаю со студенческими работами здесь

Очень долгий запрос
Здравствуйте Возникла необходимость создания своего класса в CMS Престашоп. Все получается, но один запрос к таблице, в котором одно из...

Очень долгий запуск 1С БП 3.0
Всем привет. По не известной причине, примерно после обновления конфы БП на 3.0.70.25, запуск одной из БД (их шесть) стал очень долгим...

Очень долгий UPLOAD!
Такое дело, раньше , на ютубе видео загружалось(upload) в зависимости от длины и веса видео(что привычно) но сейчас, 62 мб видео , при...

Очень долгий запуск windows xp
Приветствую всех читающих мою тему, проблема моя в том что винда очень долго грузиться. при включении когда начинаеться загрузка винды...

Очень долгий первый старт
После включения компа просто ни чего не происходит, пост код 99 и так может быть 1-2 минуты, потом включается всё нормально. Это только,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru