Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
Заблокирован
1

Придумал быстрый способ создать список простых чисел

14.10.2013, 05:44. Показов 3186. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Без использования рекурсий и сложных алгоритмов
нужно только указать верхнее значение MAX

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Function ProstChisla(Max&) As Long()
    'Возврат списка простых чисел
    Dim u&, s$, s1, i&, f&
    u = Max * 2
    ReDim Byt(u - 1) As Byte
    ReDim PrCh&(u)
    s = Byt: s1 = ChrB(0)
    MidB$(s, 1, 1) = 1
    PrCh(0) = 1: i = 1
    
    While PrCh(i - 1) <= Max
        PrCh(i) = InStrB(PrCh(i - 1), s, s1)
        
        For f = PrCh(i) To u Step PrCh(i)
            MidB$(s, f, 1) = 1
        Next
        i = i + 1
    Wend
    ReDim Preserve PrCh(i - 2)
    
    ProstChisla = PrCh
End Function
Добавлено через 2 минуты
Вообще я сторонник очень коротких и эффективных алгоритмов если у кого есть идеи дружите со мной!
3
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2013, 05:44
Ответы с готовыми решениями:

Как создать список простых чисел?
Как создать список простых чисел?

Быстрый способ работы с recordset
Хочу поделится способом работы с recordset'ом, который работает примерно на 30% быстрее: Пример:...

Самый быстрый способ измерить размер картинки
Привет всем. Собственно, сабж. Нужно сделать собственный компонент для ASP, который бы выдавал...

Быстрый алгоритм вычисления простых чисел
Обычно простые числа ищут среди всех нечетных чисел. Но если из нечетных чисел выкинуть числа...

19
Заблокирован
14.10.2013, 09:06 2
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
Visual Basic
1
ReDim PrCh&(u)
Слишком расточительно.
За глаза будет в четыре раза меньший массив
Visual Basic
1
ReDim PrCh&(Max\2)
А так прикольное решение
1
Заблокирован
14.10.2013, 09:13  [ТС] 3
Конечно прикольное, над этим бились ещё древние математики

Добавлено через 59 секунд
А начёт массива я подумаю, там надо его увеличивать умножением...
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
14.10.2013, 09:24 4
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
над этим бились ещё древние математики
почему такое простое имя "Function ProstChisla"
0
Заблокирован
14.10.2013, 09:28  [ТС] 5
Наверное из за недостатка вдохновения
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
14.10.2013, 09:34 6
ошибся, подумалось из за избытка скромности
0
Заблокирован
15.10.2013, 07:41  [ТС] 7
Апострофф Я протестировал получилось ещё лучше спасибо !!!


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Function ProstChisla(Max&) As Long()
    'Возврат списка простых чисел
    Dim u&, s$, s1, i&, f&
    u = Max * 2
    ReDim Byt(u - 1) As Byte
    ReDim PrCh&(Max / 2)
    s = Byt: s1 = ChrB(0)
    MidB$(s, 1, 1) = 1
    PrCh(0) = 1: i = 1
    
    While PrCh(i - 1) <= Max
        PrCh(i) = InStrB(PrCh(i - 1), s, s1)
        
        For f = PrCh(i) To u Step PrCh(i)
            MidB$(s, f, 1) = 1
        Next
        i = i + 1
    Wend
    ReDim Preserve PrCh(i - 2)
    
    ProstChisla = PrCh
End Function
1
Заблокирован
15.10.2013, 08:33 8
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
я сторонник очень коротких и эффективных алгоритмов
Доверяй, но проверяй
Вот вариант более доступной для понимания, быстрой, менее требовательной к ресурсам реализации решета
Кликните здесь для просмотра всего текста
Visual Basic
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Option Explicit
 
Public Function ProstChisla(Max&) As Long()
    'Возврат списка простых чисел
    Dim u&, s$, s1, i&, f&
    u = Max * 2
    ReDim Byt(u - 1) As Byte
    ReDim PrCh&(Max \ 2)
    s = Byt: s1 = ChrB(0)
    MidB$(s, 1, 1) = 1
    PrCh(0) = 1: i = 1
    While PrCh(i - 1) <= Max
        PrCh(i) = InStrB(PrCh(i - 1), s, s1)
        
        For f = PrCh(i) To u Step PrCh(i)
            MidB$(s, f, 1) = 1
        Next
        i = i + 1
    Wend
    ReDim Preserve PrCh(i - 2)
    
    ProstChisla = PrCh
End Function
 
Sub test()
Dim a
Dim b
Dim t As Single
 
t = Timer
a = ProstChisla(10000000)
Debug.Print Timer - t '10,71875
 
t = Timer
b = GetSimpleArray(10000000)
Debug.Print Timer - t '1,796875
 
End Sub
 
Public Function GetSimpleArray(Max&) As Long()
'Возврат списка простых чисел
Dim i&, f&, d&
ReDim b(1 To Max) As Byte
ReDim GSA&(1 To Max \ 2)
GSA(1) = 1
GSA(2) = 2
i = 2
d = 1
Do
  For f = GSA(i) To Max Step GSA(i) 'вычеркиваем кратные последнему простому
    b(f) = 1
  Next f
  
  For f = GSA(i) + d To Max Step 2 'ищем следующее простое число
    If b(f) = 0 Then i = i + 1: GSA(i) = f: Exit For
  Next f
  d = 2
Loop Until f > Max
ReDim Preserve GSA(1 To i)
GetSimpleArray = GSA
End Function
2
Заблокирован
15.10.2013, 09:42  [ТС] 9
Я просматриваю )))

Добавлено через 3 минуты
а за основу взята всётаки моя идея ))) но ваша идея лучше !

Добавлено через 3 минуты
а вот результаты таймера на моём процесоре

26,79688
4,875

Добавлено через 37 минут
Единственное замечание по базовому индексу, который у вас начинается с еденицы
и переменной D она в цикле может и не учавствовать
0
Апострофф
15.10.2013, 10:18
  #10

Не по теме:

Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
над этим бились ещё древние математики
Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
всётаки моя идея
Здавствуйте, Эратосфе́н:senor:, рад знакомству:drink:

1
Заблокирован
15.10.2013, 10:33  [ТС] 11
Ок надо будет почитать на досуге, чем занимались великие математики, если честно не интересовался )))))))
0
44 / 44 / 3
Регистрация: 18.12.2011
Сообщений: 571
15.10.2013, 12:23 12
Интересно сколько времени займёт число 1 000 000 000
За это вроде как денежная награда
0
Заблокирован
15.10.2013, 12:27  [ТС] 13
У меня мой старенький ПК не вывезет )))
0
44 / 44 / 3
Регистрация: 18.12.2011
Сообщений: 571
15.10.2013, 12:32 14
Если убрать пробелы то это всё 1 простое число
Кликните здесь для просмотра всего текста

49310 83597 02850 19002 75777 67239 07649 57284 90777 21502 08632 08075 01840 97926 27885 09765 88645 57802 01366 00732 86795 44734 11283 17353 67831 20155 75359 81978 54505 48115 71939 34587 73300 38009 93261 95058 76452 50238 20408 11018 98850 42615 17657 99417 04250 88903 70291 19015 87003 04794 32826 07382 14695 41570 33022 79875 57681 89560 16240 30064 11151 69008 72879 83819 42582 71674 56477 48166 84347 92846 45809 29131 53186 00700 10043 35318 93631 93439 12948 60445 03709 91980 04770 94629 21558 18071 11691 53031 87628 84778 78354 15759 32891 09329 54473 50881 88246 54950 60005 01900 62747 05305 38116 42782 94267 47485 34965 25745 36815 11706 55028 19055 52656 22135 31463 10421 00866 28679 71144 46706 36692 19825 86158 11125 15556 50481 34207 68673 23407 65505 48591 08269 56266 69306 62367 99702 10481 23965 62518 00681 83236 53959 34839 56753 57557 53246 19023 48106 47009 87753 02795 61868 92925 38069 33052 04238 14996 99454 56945 77413 83356 89906 00587 08321 81270 48611 33682 02651 59051 66351 87402 90181 97693 93767 78529 28722 10955 04129 25792 57381 86605 84501 50552 50274 99477 18831 29310 45769 80909 15304 61335 94190 30258 81320 59322 77444 38525 50466 77902 45186 97062 62778 88919 79580 42306 57506 15669 83469 56177 97879 65920 16440 51939 96071 69811 12615 19561 02762 83233 98257 91423 32172 69614 43744 38105 64855 29348 87634 92103 09887 02878 74532 33132 53212 26786 33283 70279 25099 74996 94887 75936 91591 76445 88032 71838 47402 35933 02037 48885 06755 70658 79194 61134 19323 07814 85443 64543 75113 20709 86063 90746 41756 41216 35042 38800 29678 08558 67037 03875 09410 76982 11837 65499 20520 43682 55854 64228 85024 29963 32268 53691 24648 55000 75591 66402 47292 40716 45072 53196 74499 95294 48434 74190 21077 29606 82055 81309 23626 83798 79519 66199 79828 55258 87161 09613 65617 80745 66159 24886 60889 81645 68541 72136 29208 46656 27913 14784 66791 55096 51543 10113 53858 62081 96875 83688 35955 77893 91454 53935 68199 60988 08540 47659 07358 97289 89834 25047 12891 84162 65878 96821 85380 87956 27903 99786 29449 39760 54675 34821 25675 01215 17082 73710 76462 70712 46753 21024 83678 15940 00875 05452 54353 7

Тут по моему не 1 домашний комп не вывезет, если только поставить годика на 2
в уголок пусть считает
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
15.10.2013, 12:41 15
Цитата Сообщение от Апострофф Посмотреть сообщение
Здавствуйте, Эратосфе́н, рад знакомству
0
Заблокирован
15.10.2013, 13:00 16
Цитата Сообщение от radlif Посмотреть сообщение
Интересно сколько времени займёт число 1 000 000 000
Цитата Сообщение от Mikle(bit.pirit.info)
Интересно, сколько времени уйдёт на нахождение чисел до миллиарда по такому алгоритму?
Вот код:
Код:
Visual Basic
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Option Explicit 
  
Dim Simp(4791) As Long 
Dim Mask(15014) As Byte 
Dim Out(15014) As Byte 
Dim Data(4095) As Long 
Dim nf As Long 
Public Max As Long 
Public fFile As Boolean 
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) 
 
Sub Work() 
  Dim n As Long, i As Long 
  Dim k As Long, f As Boolean 
  Dim m As Long 
  Dim Base As Long 
 
  If fFile Then 
    nf = FreeFile 
    Open "out.bin" For Binary As #nf 
    Close #nf 
    Kill "out.bin" 
    Open "out.bin" For Binary As #nf 
    k = 2 
    Put #nf, , k 
  End If 
 
  k = 0 
  n = 3 
  While n <= 46349 
    m = Sqr(n) 
    f = False 
    For i = 2 To m 
      If (n Mod i) = 0 Then f = True: Exit For 
    Next i 
    If f = False Then 
      Simp(k) = n 
      k = k + 1 
    End If 
    n = n + 2 
  Wend 
 
  i = 0 
  For n = 0 To 15014 
    If n + n + 1 = Simp(i) Then 
      Out(n) = 0 
      i = i + 1 
    Else 
      Out(n) = 1 
    End If 
  Next n 
  If fFile Then SaveData 1 
 
  For i = 0 To 15014 
    Mask(i) = 0 
  Next i 
  For n = 0 To 4 
    For i = Simp(n) \ 2 To 15014 Step Simp(n) 
      Mask(i) = 1 
    Next i 
  Next n 
 
  For Base = 30030 To Max Step 30030 
    CopyMemory Out(0), Mask(0), 15015 
    n = 5: m = Sqr(Base + 30030) 
    Do 
      k = Simp(n) 
      If k > m Then Exit Do 
      i = k - (Base Mod k) 
      If i And 1 Then 
        i = i \ 2 
      Else 
        i = (i + k) \ 2 
      End If 
      While i < 15015 
        Out(i) = 1 
        i = i + k 
      Wend 
      n = n + 1 
    Loop 
    If fFile Then SaveData Base + 1 
  Next Base 
  If fFile Then 
    SaveData Base + 1 
    Close #nf 
  End If 
End Sub 
 
Sub SaveData(ByVal Base As Long) 
  Static i As Long 
  Dim n As Long 
  For n = 0 To 15014 
    If Out(n) = 0 Then 
      Data(i) = Base + n + n 
      i = i + 1 
      If i > 4095 Then 
        Put #nf, , Data() 
        i = 0 
      End If 
    End If 
  Next n 
End Sub
Если разместить его в модуле, задать переменные Max - предел вычислений, и fFile - разрешение сохранять в файл, скомпилить со всеми оптимизациями, то на Core2, 2.4 ГГц, до миллиарда считает 2.6 сек. (5-8 сек. с записью в файл).
Этот участок кода:
Код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  k = 0 
  n = 3 
  While n <= 46349 
    m = Sqr(n) 
    f = False 
    For i = 2 To m 
      If (n Mod i) = 0 Then f = True: Exit For 
    Next i 
    If f = False Then 
      Simp(k) = n 
      k = k + 1 
    End If 
    n = n + 2 
  Wend
По простому алгоритму находит числа до 46349.
...
1
44 / 44 / 3
Регистрация: 18.12.2011
Сообщений: 571
15.10.2013, 13:07 17
По моему информация о награде неактуальна, так как число в этом посте
Придумал быстрый способ создать список простых чисел
намного больше миллиарда.
Кст по законам сша оно является незаконным так как представляет код программы для взлома двд
0
Заблокирован
15.10.2013, 13:20  [ТС] 18
Ну значит у меня около 10 секунд будет считать

Добавлено через 11 минут
Обычно такие цифры не нужны в повседневной жизни
я к примеру использую это в шифровании данных около первой 1000 простых чисел
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
15.10.2013, 15:11 19
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от JoraVoenyjHaker Посмотреть сообщение
не нужны в повседневной жизни
Тогда зачем огород городил? Классика - "Решето Эратосфена", до 1 000 000 ответ мгновенный ( проц 3.2 гГц).
Процедура очень короткая
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Sub Eratosfen(ByVal MaxNum As Long, cp As Long, p() As Long)
Dim i As Long, j As Long
Dim n() As Boolean
cp = 0
ReDim n(2 To MaxNum):
For i = 2 To MaxNum
   If Not n(i) Then
      cp = cp + 1
      ReDim Preserve p(1 To cp)
      p(cp) = i
      For j = i + i To MaxNum Step i
         n(j) = True
      Next
   End If
Next
End Sub
Использовать просто:
Visual Basic
1
2
3
4
5
6
Private Sub Command1_Click()
Dim p() As Long
Dim cp As Long
Eratosfen 1000000, cp, p()
Form1.Print "Последне число= " & p(cp)
End Sub
2
Заблокирован
15.10.2013, 16:38  [ТС] 20
Я и не говорю, что моё решение единственное правильное, решений может быть много
так уж вышло что ранее я встречал лиш алгоритмы которые гораздо медленней работали
авторы которых упорно доказывали что это самый быстрый способ, это касается не только этой темы
если вы чтото можете предложить получше то респект вам
0
15.10.2013, 16:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2013, 16:38
Помогаю со студенческими работами здесь

Создать список целых чисел. Создать новый список, записав в него отрицательные элементы
Создать список целых чисел. Создать новый список, записав в него отрицательные элементы.(задачу...

Список простых чисел
Чтобы не плодить темы, решил спросить тут. Вот кусок программы, он на JS, но это не важно. Он...

Быстрый способ регистрации
Всем привет. Сразу хочу сказать, что программировать я не умею на php, язык немного читать могу, но...

Список простых чисел из диапозона
Здравствуйте. Я пока имею сумбурное представление на этот счет, поэтому решил обратиться за...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru