![]() |
![]() |
volvo |
![]()
Сообщение
#1
|
Гость ![]() |
Числа и СуперЧисла Смита
Цитата Составное число называется Числом Смита, если сумма его цифр равна сумме всех чисел, образующихся разложением исходного числа на простые множители. Число Смита называется СуперЧислом Смита, если сумма его цифр является Числом Смита. Приведенная ниже программа ищет СуперЧисло Смита с номером X... { ********** Update: поскольку вышеприведенная функция поиска Суперчисел Смита работает очень медленно - выкладываю обновленную версию: Спойлер (Показать/Скрыть)
Немного информации о скорости работы: СуперСмит5. Старая версия: 62 мс., новая: 1 мс. СуперСмит100. Старая версия: 7653 мс., новая: 63 мс. СуперСмит200. Старая версия: 43891 мс., новая: 220 мс. Сообщение отредактировано: volvo - 6.11.2010 17:47 |
![]() ![]() |
Altair |
![]()
Сообщение
#2
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Поиск совершенных чисел.
Цитата Определенный интерес для любителей представляет программа поиска совершенных чисел. Ее схема проста: в цикле для каждого числа проверять сумму его делителей и сравнивать ее с самим числом, - если они равны, то это число совершенное. Код Var I,N,Summa: LongInt; Delitel: Integer; Begin For I := 3 To 34000000 Do Begin Summa := 1; For Delitel := 2 To Trunc(Sqrt(I)) Do Begin N := (I Div Delitel); If N * Delitel = I Then Summa := Summa + Delitel + (I Div Delitel); End; If Int(Sqrt(I)) = Sqrt(I) Then Summa := Summa - Trunc(Sqrt(I)); If I = Summa Then WriteLn(I, ' - ', Summa); End; End. Добавлено (volvo):
Проверка: простое-ли число. (вполне подходит для не самых больших чисел) Код function isPrime(X: word): boolean; var i: integer; Begin isPrime:=false; for i:=2 to trunc(sqrt(x)) do if x mod i = 0 then Exit; isPrime:=true End; Реализация вероятностного алгоритма Миллера-Рабина с 20 раундами. Для примера выдает простые на отрезке [1000000000,1000100000] Код function mulmod(x,y,m:longint):longint; assembler; asm mov eax,x mul y div m mov eax,edx end; function powmod(x,a,m:longint):longint; var r:longint; begin r:=1; while a>0 do begin if odd(a) then r:=mulmod(r,x,m); a:=a shr 1; x:=mulmod(x,x,m); end; powmod:=r; end; function isprime(p:longint):boolean; var q,i,a:longint; const rounds=20; begin if odd(p) then begin isprime:=true; q:=p-1; while not odd(q) do q:=q shr 1; for i:=1 to rounds do begin a:=Random(p-2)+2; if powmod(a,p-1,p)<>1 then begin isprime:=false; break; end; a:=powmod(a,q,p); if a<>1 then begin while (a<>1) and (a<>p-1) do a:=mulmod(a,a,p); if a=1 then begin isprime:=false; break; end; end; end; end else isprime:=(p=2); end; var t:longint; begin Randomize; for t:=1000000000 to 1000100000 do if isprime(t) then writeln(t); end. -------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
![]() ![]() |
![]() |
Текстовая версия | 24.06.2025 16:39 |