В теме
“Магические квадраты” maxal представил такой генератор чисел Смита (язык PARI/GP):
Код:
? sd(n) = local(v); v=eval(Vec(Str(n))); sum(j=1,#v,v[j])
? issmith(n) = local(f); if(ispseudoprime(n),return(0)); f=factor(n); sum(j=1,matsize(f)[1],f[j,2]*sd(f[j,1]))==sd(n)
? for(n=2,10^10, if(issmith(n),print1(n,", ");); )
Ещё один генератор выложен
здесь.
Когда я только начинала работать с числами Смита, сразу воспользовалась приведённым выше генератором с форума Портала ЕН, его там сразу выложили, как только я открыла эту тему. Генератор хорошо работает, я легко сгенерировала смиты в интервале от 1 до 100000.
Недавно в гостевой книге сайта мне задали вопрос об алгоритме разложения чисел на простые множители. Решила сделать примитивную программку (ответ написала). Алгоритм простейший. Ну, а написав программу разложения чисел на простые множители, решила дописать её до генератора смитов. Повторю ещё раз: генератор детский, основан на примитивном алгоритме. К тому же программа написана на допотопном языке QBASIC. Однако работает. В программе заложена генерация смитов в интервале от 2 до 9999. Понятно, что интервал можно расширить, введя небольшие изменения в программу. Смиты в указанном интервале сгенерировались за одну минуту. По программе можно генерировать смиты в любом заданном интервале, а не только с начала натурального ряда чисел. Это код моей программы:
Код:
10 DIM P(1500), B(20)
15 OPEN "MK3.txt" FOR INPUT AS #1
20 FOR I = 1 TO 1500: INPUT #1, P(I): NEXT I
25 CLOSE #1
30 FOR U = 2 TO 9999
38 Z = U: N = U
40 I = 1: K = 1
45 X = N / P(I)
47 IF X = 1 THEN B(K) = P(I): GOTO 102
50 IF INT(X) = X THEN B(K) = P(I): N = X: K = K + 1: I = 1: GOTO 45
52 I = I + 1: GOTO 45
102 M = Z
104 GOSUB 200
105 E = A
106 D = 0
108 T = 1
110 M = B(T)
112 GOSUB 200
114 D = D + A
116 T = T + 1
118 IF T > K THEN 122
120 GOTO 110
122 IF E = D THEN IF K <> 1 THEN PRINT Z;
124 NEXT U
126 GOTO 300
200 A1 = INT(M / 1000): C1 = M - A1 * 1000
202 A2 = INT(C1 / 100): C2 = C1 - A2 * 100
204 A3 = INT(C2 / 10): A4 = C2 - A3 * 10
206 A = A1 + A2 + A3 + A4
210 RETURN
300 PRINT : PRINT
310 END
Кстати, появился ли в Википедии (в статье “Числа Смита”) какой-нибудь генератор? Я давно не заглядывала в эту статью. В ней, между прочим, есть давно устаревшие данные. Я предлагала maxal’у исправить статью. Не знаю, сделал ли он это. Очень не мешало бы вставить в статью генератор, если его ещё не вставили.
В OEIS тоже есть числа Смита. Но вот есть ли ссылка на генератор? Надо посмотреть.