Страницы: 1
RSS
Последовательность простых (натуральных) чисел
 
Здравствуйте уважаемые Форумчане!  
 
Возник (не прикладной пока) вопрос:  
Существует ли в Excel возможность получить в каком либо виде последовательность простых (натуральных) чисел, то есть чисел которые делятся без остатка только на себя и единицу (1,2,3,5,7,11...)?  
Например функция аргумент - порядковый номер такого числа, возвращаемое значение - само простое число.  
(1-1) (2-2) (3-3) (4-5) (5-7)  
Или это чисто математический вопрос?  
Поиском ничего не нашел.  
Спасибо.
 
На сколько я помню ещё школьную математику, проблема вычисления ряда простых чисел так и не решена вообще (формулы вычисления числового ряда нет).  
А Ёксель что, умнее всех математиков мира?  
Можно решить только макросом и только долгим нудным перебором.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=17.08.2010 11:13}{thema=}{post}На сколько я помню ещё школьную математику, проблема вычисления ряда простых чисел так и не решена    
Можно решить только макросом и только долгим нудным перебором.{/post}{/quote}  
Да, стыдно сказать а я вот не помню чтобы нам такое рассказывали в школьной программе. Толи с памятью, то ли со вниманием, то ли с учителями проблеммы  ...  
Конечно, сейчас представил а что там за миллиардами миллиардов.., и кто всё это будет считать...  
Хотя переформулируя вопрос представить себе "зарезервированную" просчитанную последовательность-список (на пример до 10^6, или 10^9) наверное можно. Думал может есть в Екселе.  
 
99336
 
алгоритм простой  
начиная с 5 только нечетные делить только на выявленные ранее простые числа (до корня квадратного из искомого числа округленного вверх)
 
А как это на примере будет выглядеть?
 
{quote}{login=Vlad}{date=17.08.2010 11:51}{thema=}{post}А как это на примере будет выглядеть?{/post}{/quote}  
 
Да, согласен - не очень понятен алгоритм и его практическая реализация.
 
Option Base 1  
Sub fff()  
Dim i&, j&, igr&, ii&, ir&, iy&, ik&, iii&  
Dim pri()  
jrr = 100  
ReDim pri(1 To jrr)  
pri(1) = 3  
ii = 1  
For i = 5 To jrr Step 2  
igr = Abs(Int(-i ^ 0.5))  
For iy = 1 To jrr  
If pri(iy) >= igr Then  
iii = iy  
Exit For  
End If  
Next iy  
For ik = 1 To iii  
If i Mod pri(ik) = 0 Then Exit For  
ir = ii + 1  
Next ik  
If ir - ii = 1 Then  
ii = ii + 1  
pri(ii) = i  
End If  
Next i  
MsgBox Join(pri)  
End Sub  
странно, что деление на 5 проскакивает сито  
требуется доработка
 
Формулы ряда НЕ СУЩЕСТВУЕТ!  
Есть методы построения последовательности.  
Самый древний (3 в. до н. э.) способ получения ряда простых чисел - "Решето Эратосфена":  
Из натурального ряда чисел  
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14...  
- вычеркивают кратные двум (4, 6, 8, 10, 12,...)  
- кратные трем (6, 9, 12, 15,...)  
- кратные пяти (10, 15, 20, 25, 30,...)  
- кратные семи (14, 21, 28, 35, 42, 49,...)  
и т. д.  
 
Таким образом все составные числа будут просеяны, и останутся только простые числа 2, 3, 5, 7, 11, 13...    
( http://www.wikiznanie.ru/ru-wz/index.php/Решето_Эратосфена )
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Так:  
Public Sub Eratosfen_grating()  
Dim n As Integer, r As Integer, i As Integer, s As Double, k As Integer, j As Integer  
On Error Resume Next  
n = CInt(InputBox("Number"))  
If n > 200 Then  
r = n \ (Log(n) - 2) + 1  
Else  
r = CInt(1.6 * n / Log(n) + 1)  
End If  
j = 3  
Dim p()  
ReDim p®  
p(1) = 1: p(2) = 2: p(3) = 3  
For k = 3 To n Step 2  
i = 2: s = Sqr(k)  
Cv:  
i = i + 1  
If p(i) > s Then p(j) = k: j = j + 1: GoTo Cv1  
If CInt(k / p(i)) * p(i) <> k Then GoTo Cv  
Cv1:  
Next  
For i = 1 To r  
If p(i) = 0 Then  
Stop  
Exit Sub  
End If  
Cells(i, 1) = p(i)  
Next  
'Stop  
End Sub
Я сам - дурнее всякого примера! ...
 
Вот мой вариант... на основе алгоритма Alex_ST  
Зы. хотел проверить до 1 000 000 - ждал около часа, надоело....
 
{quote}{login=Alex_ST}{date=17.08.2010 11:13}{thema=}{post}На сколько я помню ещё школьную математику, проблема вычисления ряда простых чисел так и не решена вообще (формулы вычисления числового ряда нет).  
А Ёксель что, умнее всех математиков мира?  
Можно решить только макросом и только долгим нудным перебором.{/post}{/quote}  
 
Зато формулой можно пометить простые числа...
 
{quote}{login=Михаил}{date=17.08.2010 08:05}{thema=}{post}Вот мой вариант... на основе алгоритма Alex_ST  
Зы. хотел проверить до 1 000 000 - ждал около часа, надоело....{/post}{/quote}  
Видимо из-за РеДимов в цикле(или зацикливается при переполнении).  
Вот это примерный посчет к-ва простых чисел®, при общем числе n:  
If n > 200 Then  
r = n \ (Log(n) - 2) + 1  
Else  
r = CLng(1.6 * n / Log(n) + 1)  
End If  
 
у меня:  
Ввод: 360000(больше не считает гад). за 12.97с 30758 чисел  
У Вас так и не дождался, прервал.
Я сам - дурнее всякого примера! ...
 
{quote}{login=Михаил}{date=17.08.2010 08:05}{thema=}{post}Вот мой вариант... на основе алгоритма Alex_ST  
Зы. хотел проверить до 1 000 000 - ждал около часа, надоело....{/post}{/quote}  
 
По алгоритму неизвестного от 17.08.2010, 11:44 на основании файла от Михаила post_146715.xls  
800000 - 3 секунды  
 
P.S.: мой первый макрос, сделал в QBASIC (учил когда-то в школе) и переложил в VBA
 
Класс.
Я сам - дурнее всякого примера! ...
 
Почему не хочет считать от 1 000 000? (2010, мильон строк для чисел?)
 
{quote}{login=Михаил}{date=17.08.2010 10:27}{thema=MCH}{post}Почему не хочет считать от 1 000 000? (2010, мильон строк для чисел?){/post}{/quote}  
 
у меня 2003 поэтому ограничиваюсь результатом в 65536 найденых натуральных числел, на бОльших суммах не могу проверить, да и в VBA не силен
 
{quote}{login=Михаил}{date=17.08.2010 10:27}{thema=MCH}{post}Почему не хочет считать от 1 000 000? (2010, мильон строк для чисел?){/post}{/quote}  
 
Может пересохранить файл в xlsx?
 
{quote}{login=kim}{date=17.08.2010 10:42}{thema=Re: MCH}{post}{quote}{login=Михаил}{date=17.08.2010 10:27}{thema=MCH}{post}Почему не хочет считать от 1 000 000? (2010, мильон строк для чисел?){/post}{/quote}  
 
Может пересохранить файл в xlsx?{/post}{/quote}Да я просто копирую макрос в книгу 2010.. до 800 000 считает, а выше 900 000 - Type mismatch
 
<<Почему не хочет считать от 1 000 000? (2010, мильон строк для чисел>  
у меня 2003 поэтому ограничиваюсь результатом в 65536 найденых натуральных числел, на бОльших суммах не могу проверить, да и в VBA не силен>  
 
Проблема в Range(Cells(1, 1), Cells(count, 1)) = Application.WorksheetFunction.Transpose(a) при попытке вывести более 65536 значений выдает ошибку 400. Заменив данную строчку на цыкл, через который выводятся данные, считает 1 000 000 - 8 секунд (3,9 секунды без вывода значений); 10 000 000 - менее 2х минут
 
Для интересУ проверил скорость различных версий, на 10 000 000, вот результат:  
 
за 248,12с (19,42) в 2010  
за 221,39с (19,29) в 2007  
за 56,95с (19,29) в 2003  
 
 
 
20204
 
<<Для интересУ проверил скорость различных версий, на 10 000 000, вот результат:  
 
за 248,12с (19,42) в 2010  
за 221,39с (19,29) в 2007  
за 56,95с (19,29) в 2003  
>>  
 
считает одинаково, а выводит по разному. и судя по скорости машинка у Вас быстрая, значительно быстрее моей :(
 
{quote}{login=MCH}{date=18.08.2010 02:06}{thema=Re: }{post} и судя по скорости машинка у Вас быстрая, значительно быстрее моей :({/post}{/quote}  
моя (1000'000, в 2003)  
за 3,8с  (0,98)   78499 чисел    
Ваша  
за 8,5с   (3,89) 78499 чисел
 
Спасибо Всем - здорово и познавательно! И формулы и макросы!  
 
По последнему предложенному коду, 2003 экс:  
 
за 5,28с (0,88) 78499 чисел 1000000  
за 6,66с (2,06) 148934 чисел 2000000  
за 44,62с (17) 664580 чисел 10000000
Страницы: 1
Читают тему
Наверх