第20講 一般種法による魔方陣ソフトの高速化
第5話 新しい番号付けのヒントその5

19次の場合を例に説明しましょう。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
0 0 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 19 1
1  54 1 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 20 86 2
2 55 87 2 103 104 105 106 107 108 109 110 111 112 113 114 115 21 116 117 3
3 56 88 118 3 133 134 135 136 137 138 139 140 141 142 143 22 144 145 146 4
4 57 89 119 147 4 161 162 163 164 165 166 167 168 169 23 170 171 172 173 5
5 58 90 120 148 174 5 187 188 189 190 191 192 193 24 194 195 196 197 198 6
6 59 91 121 149 175 199 6 211 212 213 214 215 25 216 217 218 219 220 221 7
7 60 92 122 150 176 200 222 7 233 234 235 26 236 237 238 239 240 241 242 8
8 61 93 123 151 177 201 223 243 8 253 27 254 255 256 257 258 259 260 261 9
9 62 94 124 152 178 202 224 244 262 9 271 272 273 274 275 276 277 278 279
10 63 95 125 153 179 203 225 245 28 280 10 289 290 291 292 293 294 295 296
11 64 96 126 154 180 204 226 29 263 281 297 11 305 306 307 308 309 310 311
12 65 97 127 155 181 205 30 246 264 282 298 312 12 319 320 321 322 323 324
13 66 98 128 156 182 31 227 247 265 283 299 313 325 13 331 332 333 334 335
14 67 99 129 157 32 206 228 248 266 284 300 314 326 336 14 341 342 343 344
15 68 100 130 33 183 207 229 249 267 285 301 315 327 337 345 15 349 350 351
16 69 101 34 158 184 208 230 250 268 286 302 316 328 338 346 352 16 355 356
17 70 35 131 159 185 209 231 251 269 287 303 317 329 339 347 353 357 17 359
18 36 102 132 160 186 210 232 252 270 288 304 318 330 340 348 354 358 360 18


以下最初の数列をa、その階差数列をbとします。
また、m=n/2です。この例ではm=19/2=9(少数は切り捨てられる。)
最初に、4つの数列(対角線と逆対角線の上下の数列)
37,71,103,133,161,187,211,233,253
54,87,118,147,174,199,222,243,262
271,289,305,319,331,341,349,355,359
280,297,312,325,336,345,352,357,360
の一般項を求めておきましょう。

まず、数列37,71,103,133,161,187,211,233,253から。
37,71,103,133,161,187,211,233,253の階差数列は、
34,32,30,28,26,24,22,20は、
(n−2)+(n−2),(n−2)−1+(n−2)−1,(n−2)−2+(n−2)−2,・・・,(n−2)−(m−2)+(n−2)−(m−2)
であり、数列{b}の一般項は、
=(n−2)−( −1)+(n−2)−(−1)=2*n-2*−2(は表の一番左で=1から=m)
であり、数列{a}の初項は
37=2*n−1なので、
=2*n−1+Σ(2*n−2*k−2)(kはk=1からk=j−1まで)=2*n−1+(2*n−j−2)*(j−1)

次に、数列54,87,118,147,174,199,222,243,262について。
54,87,118,147,174,199,222,243,262の階差数列は、
33,31,29,27,25,23,21,19は、
(n−2)+{(n−2)−1},(n−2)−1+{(n−2)−1}−1,(n−2)−2+{(n−2)−1}−2,・・・,(n−2)−(m−2)+{(n−2)−1}−(m−2)
であり、数列{b}の一般項は、
=(n−2)−( −1)+{(n−2)−1}−(−1)=2*n-2*−3(は表の一番左で=1から=m)
であり、数列{a}の初項は
54=(2*n−1)+(n−2)=3*n−3なので、
=3*n−3+Σ(2*n−2*k−3)(kはk=1からk=−1まで)=3*n−3+(2*n−−3)*(−1)

3番目に、数列271,289,305,319,331,341,349,355,359について。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
0 0 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 19
1  54 1 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 20 86
2 55 87 2 103 104 105 106 107 108 109 110 111 112 113 114 115 21 116 117
3 56 88 118 3 133 134 135 136 137 138 139 140 141 142 143 22 144 145 146
4 57 89 119 147 4 161 162 163 164 165 166 167 168 169 23 170 171 172 173
5 58 90 120 148 174 5 187 188 189 190 191 192 193 24 194 195 196 197 198
6 59 91 121 149 175 199 6 211 212 213 214 215 25 216 217 218 219 220 221
7 60 92 122 150 176 200 222 7 233 234 235 26 236 237 238 239 240 241 242
8 61 93 123 151 177 201 223 243 8 253 27 254 255 256 257 258 259 260 261
9 62 94 124 152 178 202 224 244 262 9 271 272 273 274 275 276 277 278 279 1
10 63 95 125 153 179 203 225 245 28 280 10 289 290 291 292 293 294 295 296 2
11 64 96 126 154 180 204 226 29 263 281 297 11 305 306 307 308 309 310 311 3
12 65 97 127 155 181 205 30 246 264 282 298 312 12 319 320 321 322 323 324 4
13 66 98 128 156 182 31 227 247 265 283 299 313 325 13 331 332 333 334 335 5
14 67 99 129 157 32 206 228 248 266 284 300 314 326 336 14 341 342 343 344 6
15 68 100 130 33 183 207 229 249 267 285 301 315 327 337 345 15 349 350 351 7
16 69 101 34 158 184 208 230 250 268 286 302 316 328 338 346 352 16 355 356 8
17 70 35 131 159 185 209 231 251 269 287 303 317 329 339 347 353 357 17 359 9
18 36 102 132 160 186 210 232 252 270 288 304 318 330 340 348 354 358 360 18


271,289,305,319,331,341,349,355,359の階差数列は、
18,16,14,12,10,8,6,4は、
m+m,m−1+m−1,m−2+m−2,・・・,m−(m−2)+m−(m−2)
であり、数列{b}の一般項は、
=m−( −1)+m−(−1)=2*m-2*+2(は表の一番左で=1から=m)
であり、数列{a}の初項は
271=3*n−3+(2*n−m−3)*(m−1)+m=3*n−3+m+(2*n−m−3)*(m−1)なので
(3*n−3+(2*n−−3)*(−1)は3*n−3+(2*n−−3)*(−1)にmを代入したものでこれは2番目の数列の最後262に対応しています。)、
=3*n−3+m+(2*n−m−3)*(m−1)+Σ(2*m-2*k+2)(kはk=1からk=j−1まで)=3*n−3+m+(2*n−m−3)*(m−1)+(2*m+2−)*(−1)

最後に、数列280,297,312,325,336,345,352,357,360について
280,297,312,325,336,345,352,357,360の階差数列は、
17、15,13,11,9,7,5,3は数列18,16,14,12,10,8,6,4から1引いたものなので
=2*m-2*+1
であり、数列{a}の初項は
280=3*n−3+m+(2*n−m−3)*(m−1)+m=3*n−3+2*m+(2*n−m−3)*(m−1)なので
(3*n−3+m+(2*n−m−3)*(m−1)は、3番目の数列の初項すなわち271に対応しています。)、
=3*n−3+2*m+(2*n−m−3)*(m−1)+Σ(2*m-2*k+1)(kはk=1からk=−1まで)
=3*n−3+2*m+(2*n−m−3)*(m−1)+(2*m+1−)*(−1)


第20講第4話へ 第20講第6話へ



VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座