Prím-spirál

 

         Néhány évvel ezelőtt láttam egy filmet (sajnos nem emlékszem a pontos dátumra, helyre és címre), amelyben szó volt egy nagy titkot felfedő üzenetről, melyet a következőképpen lehetett megismerni: a természetes számokat spirális alakban kellett felírni, minél nagyobb értékig. A következő lépésben csak a prímszámokat kellett meghagyni a táblázatban a többit törölni. Ez után a számokat pontokra kell cserélni, az ábrát sűríteni és az így kapott ábrából lehetett volna az üzenet tartalmára következtetni. Úgy gondoltam ezt kipróbálom, vajon mekkora benne a csúsztatás. Az, hogy némi szabályosság fellelhető az ábrán, kétségtelen. De, hogy valami nagy titkot rejtene, azt kétlem.

 

Első lépésként lássuk az első 256 számot a kérdéses elrendezésben:

 

255

254

253

252

251

250

249

248

247

246

245

244

243

242

241

240

196

195

194

193

192

191

190

189

188

187

186

185

184

183

182

239

197

144

143

142

141

140

139

138

137

136

135

134

133

132

181

238

198

145

100

99

98

97

96

95

94

93

92

91

90

131

180

237

199

146

101

64

63

62

61

60

59

58

57

56

89

130

179

236

200

147

102

65

36

35

34

33

32

31

30

55

88

129

178

235

201

148

103

66

37

16

15

14

13

12

29

54

87

128

177

234

202

149

104

67

38

17

4

3

2

11

28

53

86

127

176

233

203

150

105

68

39

18

5

0

1

10

27

52

85

126

175

232

204

151

106

69

40

19

6

7

8

9

26

51

84

125

174

231

205

152

107

70

41

20

21

22

23

24

25

50

83

124

173

230

206

153

108

71

42

43

44

45

46

47

48

49

82

123

172

229

207

154

109

72

73

74

75

76

77

78

79

80

81

122

171

228

208

155

110

111

112

113

114

115

116

117

118

119

120

121

170

227

209

156

157

158

159

160

161

162

163

164

165

166

167

168

169

226

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

 

 

         Jól látható, hogy néhány prímszám átlós elrendeződésben jelenik meg, de ezek az együttállások nem igazán hosszúak (pl.: 3, 5, 13, 19, 31, 41, 71, 109; vagy: 5, 7, 17, 23, 37, 47, 79, 119, 167, 223). Az is jól látható, hogy bizonyos átlókon egyetlen prímszám sem lesz. (pl.: 0, 4, 8, 16, 24, 36, 48, 64, 80 …) Ugyancsak nem lesz egyetlen prímszám sem, a páros számokat tartalmazó átlókon, ugyanis a táblázat párosság szerint sakktábla-szerű elrendezés (kivéve természetes azt, amelyen az egyetlen páros prímszám, a 2 található). A prímszámoknak ilyentén ábrázolására először Stanislaw Ulam lengyel matematikus 1963-ban gondolt, és ezt az ábrázolást az Ő tiszteletére a matematika Ulam-spirálnak nevezi.

 

         Programozás-technikailag az jelentett némi fejtörést, vajon hogyan lehetne az előbbi számtáblát minél könnyebben létrehozni. A listából kiderül, hogy aránylag egyszerű (természetesen más eszközökkel is lehet hasonlóan egyszerű) kódot sikerült alkotni. A megjelenítő form grafikus méretéhez igazodva a számolás 501972-ig történt.

 

         Íme a végeredmény:

 

 

         A program listája pedig:

 

unit UPrimSpiral;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses

  GraphicsControlsFormsDialogsStdCtrls;

type
  TfmPrimSpiral = class(TForm)
    btKilepesTButton;
    procedure btKilepesClick(SenderTObject);
    procedure FormPaint(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

var
  fmPrimSpiralTfmPrimSpiral;

implementation

{$R *.dfm}

Function Prime(S: Word): Boolean;
Var J: Word;
Begin
  Prime:= FalseIf S In [0,1] Then ExitPrime:= True;
  For J:= 2 To Trunc(Sqrt(S)) Do If (S Mod J)=0 Then
  Begin Prime:= FalseBreak End;
End;

procedure TfmPrimSpiral.btKilepesClick(SenderTObject);
begin
  Close;
end;

procedure TfmPrimSpiral.FormPaint(SenderTObject);
Var I, M, X, Y: Integer;
    N: LongInt;
    S: String;
begin
  N:= 0; M:= 0;
  With Canvas Do
  Begin
    X:= ClientWidth Div 2;
    Y:= ClientHeight Div 2;
    Repeat
      For I:= 0 To M Do
      Begin If Prime(N) Then Pixels[X,Y]:= 0; Inc(N); Inc(X) End;
      For I:= 0 To M Do
      Begin If Prime(N) Then Pixels[X,Y]:= 0; Inc(N); Dec(Y) End;
      Inc(M);
      For I:= 0 To M Do
      Begin If Prime(N) Then Pixels[X,Y]:= 0; Inc(N); Dec(X) End;
      For I:= 0 To M Do
      Begin If Prime(N) Then Pixels[X,Y]:= 0; Inc(N); Inc(Y) End;
      Inc(M);
    Until N>500000;
    Str(N,S); TextOut(10,50,S);
  End;
end;

end.