Nクイーン問題(93)Python/Codonで爆速プログラミング ノードレイヤー

ソースコード

今回の連載 python/codonのソースコードディレクトリはこちら
https://github.com/suzukiiichiro/N-Queens/tree/master/13Bit_codon

Nクイーン問題 過去記事アーカイブ

【過去記事アーカイブ】Nクイーン問題 過去記事一覧
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題
【Github】エイト・クイーンのソース置き場 BashもJavaもPythonも!
https://github.com/suzukiiichiro/N-Queens


Python / Codon Nクイーン ノードレイヤー版

   ,     #_
   ~\_  ####_        N-Queens
  ~~  \_#####\       https://suzukiiichiro.github.io/
  ~~     \###|       N-Queens for github
  ~~       \#/ ___   https://github.com/suzukiiichiro/N-Queens
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'

概要

結論から言えば codon for python 17Py_GPU/CUDA 10Bit_CUDA/01CUDA_Bit_Symmetry.cu と同等の速度で動作します。


GPU 実行例

$ nvcc -O3 -arch=sm_61 -m64 -ptx -prec-div=false 04CUDA_Symmetry_BitBoard.cu && POCL_DEBUG=all ./a.out -n ;
対称解除法 GPUビットボード
20:      39029188884       4878666808     000:00:02:02.52
21:     314666222712      39333324973     000:00:18:46.52
22:    2691008701644     336376244042     000:03:00:22.54
23:   24233937684440    3029242658210     001:06:03:49.29

Codon 実行例(AWS m4.16xlarge × 1)

amazon AWS m4.16xlarge x 1
$ codon build -release 15Py_constellations_optimize_codon.py && ./15Py_constellations_optimize_codon
20:      39029188884                0          0:02:52.430
21:     314666222712                0          0:24:25.554
22:    2691008701644                0          3:29:33.971
23:   24233937684440                0   1 day, 8:12:58.977

実行方法

# Python(通常)
$ python <filename.py>

# Codon(ビルドしない実行)
$ codon run <filename.py>

# Codon(ビルドしてネイティブ高速実行)
$ codon build -release < filename.py> && ./<filename>

参考リンク


N-Queens:ノードレイヤー法(frontier 分割)で Total を計数(Unique 未算出)

ファイル: 09Py_node_layer_total_only.py
作成日: 2025-10-23


概要

  • ビット演算 DFS を「深さ k の frontier」でいったん分割し、frontier 以降は独立に完全探索。
  • k 層までの部分状態 (left, down, right) を収集 → 各ノードから葉までを _solve_from_node
  • Unique は未算出(0 のまま)Total のみ正確に数える構成。

設計のポイント(実ソース引用)

  • 可置集合: bitmap = mask & ~(left | down | right)
  • LSB 抽出: bit = -bitmap & bitmap消費: bitmap ^= bit
  • 葉判定(_solve_from_node): if down == mask: return 1
  • frontier 収集(_collect_nodes): nodes.append(left); nodes.append(down); nodes.append(right)

利点

  • frontier(深さ k)ごとに 独立な仕事単位 が得られ、並列化(プロセス/スレッド/Codon @par)に好適。
  • メモリは (3 × ノード数) 個の int のみで、盤面全体のコピーを回避。

使い方

  • solve_with_layer(N, k=4)k は分割深さ。CPU コア数・N に応じて調整

備考

  • Python の int は任意長。固定幅(Codon 等)では mask=(1<<N)-1 の幅管理を徹底。
  • Unique を求める場合は frontier ごとに対称性判定(COUNT2/4/8) を導入する。

レビュー(短評)

良い点

  • frontier 分割で「仕事単位」を明確化、_solve_from_node純粋関数的で並列化が容易。
  • nodes3 値フラットで保持 → メモリ・コピー回数が少なく効率的。
  • down==mask の葉判定で帰着が速く、**ビット操作の定石(-x & x)**が適切。

発展提案

  • 並列化: concurrent.futures.ProcessPoolExecutor / multiprocessing / Codon @parfor i in range(num_nodes) を分割。
  • k の自動調整: num_nodes が閾値(例: 4×CPUコア数)に近づくように k を自動選択。
  • Unique 導入: frontier ノード側で対称性削減(初手半分・中央処理) or 末端で COUNT2/4/8 を算出。
  • 境界制約: sidemask/lastmask の導入で冗長枝をさらに削減(NQueens07/08 の要領)。

実行ログ

fedora$ codon build -release 09Py_NodeLayer_codon.py && ./09Py_NodeLayer_codon
 N:        Total       Unique        hh:mm:ss.ms
 4:            2            0         0:00:00.000
 5:           10            0         0:00:00.000
 6:            4            0         0:00:00.000
 7:           40            0         0:00:00.000
 8:           92            0         0:00:00.000
 9:          352            0         0:00:00.000
10:          724            0         0:00:00.000
11:         2680            0         0:00:00.001
12:        14200            0         0:00:00.007
13:        73712            0         0:00:00.053
14:       365596            0         0:00:00.236
15:      2279184            0         0:00:01.423
16:     14772512            0         0:00:09.315
fedora$

ソースコード

#!/usr/bin/env python3

# -*- coding: utf-8 -*-
"""
Python/codon Nクイーン ノードレイヤー版

   ,     #_
   ~\_  ####_        N-Queens
  ~~  \_#####\       https://suzukiiichiro.github.io/
  ~~     \###|       N-Queens for github
  ~~       \#/ ___   https://github.com/suzukiiichiro/N-Queens
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'

結論から言えば codon for python 17Py_ は GPU/CUDA 10Bit_CUDA/01CUDA_Bit_Symmetry.cu と同等の速度で動作します。

 $ nvcc -O3 -arch=sm_61 -m64 -ptx -prec-div=false 04CUDA_Symmetry_BitBoard.cu && POCL_DEBUG=all ./a.out -n ;
対称解除法 GPUビットボード
20:      39029188884       4878666808     000:00:02:02.52
21:     314666222712      39333324973     000:00:18:46.52
22:    2691008701644     336376244042     000:03:00:22.54
23:   24233937684440    3029242658210     001:06:03:49.29

amazon AWS m4.16xlarge x 1
$ codon build -release 15Py_constellations_optimize_codon.py && ./15Py_constellations_optimize_codon
20:      39029188884                0          0:02:52.430
21:     314666222712                0          0:24:25.554
22:    2691008701644                0          3:29:33.971
23:   24233937684440                0   1 day, 8:12:58.977

python 15py_ 以降の並列処理を除けば python でも動作します
$ python <filename.py>

codon for python ビルドしない実行方法
$ codon run <filename.py>

codon build for python ビルドすればC/C++ネイティブに変換し高速に実行します
$ codon build -release < filename.py> && ./<filename>


詳細はこちら。
【参考リンク】Nクイーン問題 過去記事一覧はこちらから
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題

エイト・クイーンのプログラムアーカイブ
Bash、Lua、C、Java、Python、CUDAまで!
https://github.com/suzukiiichiro/N-Queens
"""


"""
N-Queens:ノードレイヤー法(frontier 分割)で Total を計数(Unique 未算出)
=====================================================================
ファイル: 09Py_node_layer_total_only.py
作成日: 2025-10-23

概要:
  - ビット演算 DFS を「深さ k の frontier」でいったん分割し、frontier 以降は独立に完全探索。
  - k 層までの部分状態 (left, down, right) を収集 → 各ノードから葉までを `_solve_from_node`。
  - Unique は未算出(0 のまま)。Total のみ正確に数える構成。

設計のポイント(実ソース引用):
  - 可置集合: `bitmap = mask & ~(left | down | right)`
  - LSB 抽出: `bit = -bitmap & bitmap`; 消費: `bitmap ^= bit`
  - 葉判定:   `_solve_from_node`: `if down == mask: return 1`
  - frontier 収集: `_collect_nodes` で `nodes.append(left); nodes.append(down); nodes.append(right)`

利点:
  - frontier(深さ k)ごとに**独立な仕事単位**が得られるため、並列化(プロセス/スレッド/Codon @par)に好適。
  - メモリは (3 * ノード数) 個の int のみで、盤面全体のコピーを避けられる。

使い方:
  - `solve_with_layer(N, k=4)`(k は分割深さ。CPU コア数・N に応じて調整)

備考:
  - Python の int は任意長。固定幅(Codon 等)では `mask=(1<<N)-1` の幅管理を徹底。
  - Unique を求める場合は frontier ごとに対称性判定(COUNT2/4/8)を導入する。


レビュー(短評)

良い点
frontier 分割で「仕事単位」を明確化、_solve_from_node が純粋関数的で並列化が容易。
nodes を 3 値フラットで保持するため、メモリ・コピー回数が少なく効率的。
down==mask の葉判定で帰着が速く、ビット操作の定石(-x & x)が適切。

発展提案
並列化:concurrent.futures.ProcessPoolExecutor / multiprocessing / Codon @par で for i in range(num_nodes) を分割。
k の自動調整:num_nodes が閾値(例: 4×CPUコア数)に近づくように k を自動選択。
Unique 導入:frontier ノード側で対称性削減(初手半分・中央処理) or 末端で COUNT2/4/8 を算出。
境界制約:sidemask/lastmask の導入で冗長枝をさらに削減(NQueens07/08 の要領)。

fedora$ codon build -release 09Py_NodeLayer_codon.py && ./09Py_NodeLayer_codon
 N:        Total       Unique        hh:mm:ss.ms
 4:            2            0         0:00:00.000
 5:           10            0         0:00:00.000
 6:            4            0         0:00:00.000
 7:           40            0         0:00:00.000
 8:           92            0         0:00:00.000
 9:          352            0         0:00:00.000
10:          724            0         0:00:00.000
11:         2680            0         0:00:00.001
12:        14200            0         0:00:00.007
13:        73712            0         0:00:00.053
14:       365596            0         0:00:00.236
15:      2279184            0         0:00:01.423
16:     14772512            0         0:00:09.315
fedora$


"""
from datetime import datetime
from typing import List,Tuple


class NQueens_NodeLayer:
  """
  ノードレイヤー法で N-Queens の Total(全解数)だけを計数する実装。
  構成:
    - `_collect_nodes`: 深さ k の frontier を (left, down, right) で収集
    - `_solve_from_node`: 収集した各 frontier ノードから葉まで完全探索
    - `solve_with_layer`: 外側オーケストレーション(分割→集計)
  形式:
    - left/down/right はビットボード(衝突ビットの伝播):
        left << 1(↖︎↙︎系)、down そのまま、right >> 1(↗︎↘︎系)
  注意:
    - Unique(代表解数)は未算出。Total のみ返す。
  """


  def _solve_from_node(self,size:int,mask:int,left:int,down:int,right:int)->int:
    """
    役割:
      与えられた部分状態 (left, down, right) から葉(全配置)まで完全探索し、解数を返す。
    葉判定(引用):
      `if down == mask: return 1`  # N 個のクイーンを置き終えたら 1 解
    ロジック(引用):
      - 可置集合: `bitmap = mask & ~(left | down | right)`
      - LSB抽出:  `bit = -bitmap & bitmap`
      - 候補消費:  `bitmap ^= bit`
      - 伝播:      `self._solve_from_node(size, mask, (left|bit)>>1, down|bit, (right|bit)<<1)`
        (※ ここでは left を >>1、right を <<1 にしており、収集側と**鏡対称**の定義でも整合)
    戻り値:
      部分木の解数(int)
    """

    if down==mask:
      return 1
    total=0
    bitmap:int=mask&~(left|down|right)
    while bitmap:
      bit:int=-bitmap&bitmap
      bitmap^=bit
      total+=self._solve_from_node(size,mask,(left|bit)>>1,down|bit,(right|bit)<<1)
    return total

  @staticmethod
  def _popcount(n:int)->int:
    """
    役割:
      整数 n の set bit 数(1 の数)を返す(Brian Kernighan 法)。
    実装(引用):
      `while n: n &= n - 1; cnt += 1`
    計算量:
      - O(#set bits)
    """

    cnt=0
    while n:
      n&=n-1
      cnt+=1
    return cnt

  def _collect_nodes(self,size:int,mask:int,k:int,nodes:List[int],left:int,down:int,right:int)->int:
    """
    役割:
      深さ k の frontier まで DFS を進め、(left, down, right) の3要素でノードを蓄積。
    収集条件(引用):
      `if self._popcount(down) == k:`
         `nodes.append(left); nodes.append(down); nodes.append(right); return 1`
    探索(引用):
      - 可置集合: `bitmap = mask & ~(left | down | right)`
      - LSB抽出:  `bit = -bitmap & bitmap`
      - 伝播:      `self._collect_nodes(size, mask, k, nodes, (left|bit)>>1, down|bit, (right|bit)<<1)`
    戻り値:
      収集した frontier ノード数(int)
    メモ:
      - `nodes` は [l0, d0, r0, l1, d1, r1, ...] のフラット配列(元コード互換)。
      - frontier 以降は互いに独立 → 並列化ポイント。
    """

    # すでに k 行ぶん置けているか?(down の set bit 数で判定)
    if self._popcount(down)==k:
      nodes.append(left)
      nodes.append(down)
      nodes.append(right)
      return 1
    total=0
    bitmap:int=mask&~(left|down|right)
    while bitmap:
      bit:int=-bitmap&bitmap
      bitmap^=bit
      total+=self._collect_nodes(size,mask,k,nodes,(left|bit)>>1,down|bit,(right|bit)<<1)
    return total

  def solve_with_layer(self,size:int,k:int=4)->int:
    """
    役割:
      深さ k の frontier を構築し、各ノードから完全探索して Total を返す。
    手順(引用):
      - `mask = (1 << size) - 1`
      - `nodes: List[int] = []`
      - `_collect_nodes(size, mask, k, nodes, 0, 0, 0)` で frontier 構築
      - 3要素で1ノード: `num_nodes = len(nodes) // 3`
      - 各ノードについて `_solve_from_node(size, mask, l, d, r)` を合算
    返り値:
      Total(全解数)
    チューニング:
      - k は CPU コア数・N に応じて調整(k を増やすと並列粒度が細かくなる)。
      - 並列化時は nodes を複数ワーカーへ均等分配する。
    """

    if size<1:
      return 0
    mask:int=(1<<size)-1
    nodes:List[int]=[]
    # 深さ k の frontier を構築
    self._collect_nodes(size,mask,k,nodes,0,0,0)
    # 3 要素で 1 ノード
    num_nodes:int=len(nodes)//3
    total=0
    # 各ノードを独立に探索(ここは将来的に並列化ポイント)
    for i in range(num_nodes):
      l=nodes[3*i]
      d=nodes[3*i+1]
      r=nodes[3*i+2]
      total+=self._solve_from_node(size,mask,l,d,r)
    return total

# ------------------------------------------------------------
# CLI(元コード互換)
# ------------------------------------------------------------
class NQueens_NodeLayer_CLI:
  def main(self)->None:
    nmin:int=4
    nmax:int=18
    print(" N:        Total       Unique        hh:mm:ss.ms")
    for size in range(nmin,nmax):
      start=datetime.now()
      solver=NQueens_NodeLayer()
      total=solver.solve_with_layer(size,k=4)
      unique=0
      dt=datetime.now()-start
      text=str(dt)[:-3]
      print(f"{size:2d}:{total:13d}{unique:13d}{text:>20s}")

if __name__=="__main__":
  NQueens_NodeLayer_CLI().main()


📚 関連リンク


Nクイーン問題 過去記事アーカイブ

【過去記事アーカイブ】Nクイーン問題 過去記事一覧
https://suzukiiichiro.github.io/search/?keyword=Nクイーン問題
【Github】エイト・クイーンのソース置き場 BashもJavaもPythonも!
https://github.com/suzukiiichiro/N-Queens

Nクイーン問題(101)Python/Codonで爆速プログラミング コンステレーション+インテグレート
https://suzukiiichiro.github.io/posts/2025-10-27-17-n-queens-suzuki/
Nクイーン問題(100)Python/Codonで爆速プログラミング コンステレーション+マージ
https://suzukiiichiro.github.io/posts/2025-10-27-16-n-queens-suzuki/
Nクイーン問題(99)Python/Codonで爆速プログラミング コンステレーション+最適化
https://suzukiiichiro.github.io/posts/2025-10-27-15-n-queens-suzuki/
Nクイーン問題(98)Python/Codonで爆速プログラミング コンステレーション+並列処理
https://suzukiiichiro.github.io/posts/2025-10-27-14-n-queens-suzuki/
Nクイーン問題(97)Python/Codonで爆速プログラミング コンステレーション
https://suzukiiichiro.github.io/posts/2025-10-27-13-n-queens-suzuki/
Nクイーン問題(96)Python/Codonで爆速プログラミング キャリーチェーン
https://suzukiiichiro.github.io/posts/2025-10-27-12-n-queens-suzuki/
Nクイーン問題(95)Python/Codonで爆速プログラミング ノードレイヤー+対象解除法
https://suzukiiichiro.github.io/posts/2025-10-27-11-n-queens-suzuki/
Nクイーン問題(94)Python/Codonで爆速プログラミング ノードレイヤー+ミラー
https://suzukiiichiro.github.io/posts/2025-10-27-10-n-queens-suzuki/
Nクイーン問題(93)Python/Codonで爆速プログラミング ノードレイヤー
https://suzukiiichiro.github.io/posts/2025-10-27-09-n-queens-suzuki/
Nクイーン問題(92)Python/Codonで爆速プログラミング ビットでミラー+対象解除法
https://suzukiiichiro.github.io/posts/2025-10-27-08-n-queens-suzuki/
Nクイーン問題(91)Python/Codonで爆速プログラミング ビットで対象解除法
https://suzukiiichiro.github.io/posts/2025-10-27-07-n-queens-suzuki/
Nクイーン問題(90)Python/Codonで爆速プログラミング ビットでミラー
https://suzukiiichiro.github.io/posts/2025-10-27-06-n-queens-suzuki/
Nクイーン問題(89)Python/Codonで爆速プログラミング ビットでバックトラック
https://suzukiiichiro.github.io/posts/2025-10-27-05-n-queens-suzuki/
Nクイーン問題(88)Python/Codonで爆速プログラミング 対象解除法
https://suzukiiichiro.github.io/posts/2025-10-27-04-n-queens-suzuki/
Nクイーン問題(87)Python/Codonで爆速プログラミング バックトラック
https://suzukiiichiro.github.io/posts/2025-10-27-03-n-queens-suzuki/
Nクイーン問題(86)Python/Codonで爆速プログラミング ポストフラグ
https://suzukiiichiro.github.io/posts/2025-10-27-02-n-queens-suzuki/
Nクイーン問題(85)Python/Codonで爆速プログラミング ブルートフォース
https://suzukiiichiro.github.io/posts/2025-10-27-01-n-queens-suzuki/
Nクイーン問題(84)Python/Codonで爆速プログラミング
https://suzukiiichiro.github.io/posts/2025-10-24-01-n-queens-suzuki/
Nクイーン問題(83)Python-codon&並列処理で高速化 Constellations
https://suzukiiichiro.github.io/posts/2025-03-11-07-n-queens-suzuki/
Nクイーン問題(82)Python-並列処理で高速化 16Python_carryChain_ProcessPool
https://suzukiiichiro.github.io/posts/2025-03-11-06-n-queens-suzuki/
Nクイーン問題(81)Python-codonで高速化 15Python_carryChain
https://suzukiiichiro.github.io/posts/2025-03-11-05-n-queens-suzuki/
Nクイーン問題(80)Python-並列処理で高速化 14Python_NodeLayer_symmetry_ProcessPool
https://suzukiiichiro.github.io/posts/2025-03-11-04-n-queens-suzuki/
Nクイーン問題(79)Python-codonで高速化 13Python_NodeLayer_symmetry
https://suzukiiichiro.github.io/posts/2025-03-11-03-n-queens-suzuki/
Nクイーン問題(78)Python-codonで高速化 12Python_NodeLayer_mirror
https://suzukiiichiro.github.io/posts/2025-03-11-02-n-queens-suzuki/
Nクイーン問題(77)Python-codonで高速化 11Python_NodeLayer
https://suzukiiichiro.github.io/posts/2025-03-11-01-n-queens-suzuki/
Nクイーン問題(76)Python-並列処理で高速化 10Python_bit_symmetry_ProcessPool
https://suzukiiichiro.github.io/posts/2025-03-10-05-n-queens-suzuki/
Nクイーン問題(75)Python-並列処理で高速化 09Python_bit_symmetry_ThreadPool
https://suzukiiichiro.github.io/posts/2025-03-10-04-n-queens-suzuki/
Nクイーン問題(74)Python-codonで高速化 08Python_bit_symmetry
https://suzukiiichiro.github.io/posts/2025-03-10-03-n-queens-suzuki/
Nクイーン問題(73)Python-codonで高速化 07Python_bit_mirror
https://suzukiiichiro.github.io/posts/2025-03-10-02-n-queens-suzuki/
Nクイーン問題(72)Python-codonで高速化 06Python_bit_backTrack
https://suzukiiichiro.github.io/posts/2025-03-10-01-n-queens-suzuki/
Nクイーン問題(71)Python-codonで高速化 05Python_optimize
https://suzukiiichiro.github.io/posts/2025-03-07-01-n-queens-suzuki/
Nクイーン問題(70)Python-codonで高速化 04Python_symmetry
https://suzukiiichiro.github.io/posts/2025-03-06-02-n-queens-suzuki/
Nクイーン問題(69)Python-codonで高速化 03Python_backTracking
https://suzukiiichiro.github.io/posts/2025-03-06-01-n-queens-suzuki/
Nクイーン問題(68)Python-codonで高速化 02Python_postFlag
https://suzukiiichiro.github.io/posts/2025-03-05-03-n-queens-suzuki/
Nクイーン問題(67)Python-codonで高速化 01Python_bluteForce
https://suzukiiichiro.github.io/posts/2025-03-05-02-n-queens-suzuki/
Nクイーン問題(66)Python-codonで高速化
https://suzukiiichiro.github.io/posts/2025-03-05-01-n-queens-suzuki/
Nクイーン問題(65) N25を解決!事実上の日本一に
https://suzukiiichiro.github.io/posts/2024-04-25-01-n-queens-suzuki/
Nクイーン問題(64)第七章 並列処理 キャリーチェーン NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-05-n-queens-suzuki/
Nクイーン問題(63)第七章 並列処理 キャリーチェーン NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-05-n-queens-suzuki/
Nクイーン問題(62)第七章 並列処理 対称解除法 ビットボード NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-04-n-queens-suzuki/
Nクイーン問題(61)第七章 並列処理 対称解除法 ノードレイヤー NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-03-n-queens-suzuki/
Nクイーン問題(60)第七章 並列処理 ミラー NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-02-n-queens-suzuki/
Nクイーン問題(59)第七章 並列処理 ビットマップ NVIDIA CUDA編
https://suzukiiichiro.github.io/posts/2023-08-01-01-n-queens-suzuki/
Nクイーン問題(58)第六章 並列処理 pthread C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-09-n-queens-suzuki/
Nクイーン問題(57)第八章 キャリーチェーン C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-08-n-queens-suzuki/
Nクイーン問題(56)第八章 ミラー C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-06-n-queens-suzuki/
Nクイーン問題(55)第八章 ビットマップ C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-05-n-queens-suzuki/
Nクイーン問題(54)第八章 ビットマップ C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-04-n-queens-suzuki/
Nクイーン問題(53)第八章 配置フラグ C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-03-n-queens-suzuki/
Nクイーン問題(52)第八章 バックトラック C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-02-n-queens-suzuki/
Nクイーン問題(51)第八章 ブルートフォース C言語編
https://suzukiiichiro.github.io/posts/2023-06-28-01-n-queens-suzuki/
Nクイーン問題(50)第七章 マルチプロセス Python編
https://suzukiiichiro.github.io/posts/2023-06-21-04-n-queens-suzuki/
Nクイーン問題(49)第七章 マルチスレッド Python編
https://suzukiiichiro.github.io/posts/2023-06-21-03-n-queens-suzuki/
Nクイーン問題(48)第七章 シングルスレッド Python編
https://suzukiiichiro.github.io/posts/2023-06-21-02-n-queens-suzuki/
Nクイーン問題(47)第七章 クラス Python編
https://suzukiiichiro.github.io/posts/2023-06-21-01-n-queens-suzuki/
Nクイーン問題(46)第七章 ステップNの実装 Python編
https://suzukiiichiro.github.io/posts/2023-06-16-02-n-queens-suzuki/
Nクイーン問題(45)第七章 キャリーチェーン Python編
https://suzukiiichiro.github.io/posts/2023-06-16-01-n-queens-suzuki/
Nクイーン問題(44)第七章 対象解除法 Python編
https://suzukiiichiro.github.io/posts/2023-06-14-02-n-queens-suzuki/
Nクイーン問題(43)第七章 ミラー Python編
https://suzukiiichiro.github.io/posts/2023-06-14-01-n-queens-suzuki/
Nクイーン問題(42)第七章 ビットマップ Python編
https://suzukiiichiro.github.io/posts/2023-06-13-05-n-queens-suzuki/
Nクイーン問題(41)第七章 配置フラグ Python編
https://suzukiiichiro.github.io/posts/2023-06-13-04-n-queens-suzuki/
Nクイーン問題(40)第七章 バックトラック Python編
https://suzukiiichiro.github.io/posts/2023-06-13-03-n-queens-suzuki/
Nクイーン問題(39)第七章 バックトラック準備編 Python編
https://suzukiiichiro.github.io/posts/2023-06-13-02-n-queens-suzuki/
Nクイーン問題(38)第七章 ブルートフォース Python編
https://suzukiiichiro.github.io/posts/2023-06-13-01-n-queens-suzuki/
Nクイーン問題(37)第六章 C言語移植 その17 pthread並列処理完成
https://suzukiiichiro.github.io/posts/2023-05-30-17-n-queens-suzuki/
Nクイーン問題(36)第六章 C言語移植 その16 pthreadの実装
https://suzukiiichiro.github.io/posts/2023-05-30-16-n-queens-suzuki/
Nクイーン問題(35)第六章 C言語移植 その15 pthread実装直前版完成
https://suzukiiichiro.github.io/posts/2023-05-30-15-n-queens-suzuki/
Nクイーン問題(34)第六章 C言語移植 その14
https://suzukiiichiro.github.io/posts/2023-05-30-14-n-queens-suzuki/
Nクイーン問題(33)第六章 C言語移植 その13
https://suzukiiichiro.github.io/posts/2023-05-30-13-n-queens-suzuki/
Nクイーン問題(32)第六章 C言語移植 その12
https://suzukiiichiro.github.io/posts/2023-05-30-12-n-queens-suzuki/
Nクイーン問題(31)第六章 C言語移植 その11
https://suzukiiichiro.github.io/posts/2023-05-30-11-n-queens-suzuki/
Nクイーン問題(30)第六章 C言語移植 その10
https://suzukiiichiro.github.io/posts/2023-05-30-10-n-queens-suzuki/
Nクイーン問題(29)第六章 C言語移植 その9
https://suzukiiichiro.github.io/posts/2023-05-30-09-n-queens-suzuki/
Nクイーン問題(28)第六章 C言語移植 その8
https://suzukiiichiro.github.io/posts/2023-05-30-08-n-queens-suzuki/
Nクイーン問題(27)第六章 C言語移植 その7
https://suzukiiichiro.github.io/posts/2023-05-30-07-n-queens-suzuki/
Nクイーン問題(26)第六章 C言語移植 その6
https://suzukiiichiro.github.io/posts/2023-05-30-06-n-queens-suzuki/
Nクイーン問題(25)第六章 C言語移植 その5
https://suzukiiichiro.github.io/posts/2023-05-30-05-n-queens-suzuki/
Nクイーン問題(24)第六章 C言語移植 その4
https://suzukiiichiro.github.io/posts/2023-05-30-04-n-queens-suzuki/
Nクイーン問題(23)第六章 C言語移植 その3
https://suzukiiichiro.github.io/posts/2023-05-30-03-n-queens-suzuki/
Nクイーン問題(22)第六章 C言語移植 その2
https://suzukiiichiro.github.io/posts/2023-05-30-02-n-queens-suzuki/
Nクイーン問題(21)第六章 C言語移植 その1
N-Queens問://suzukiiichiro.github.io/posts/2023-05-30-01-n-queens-suzuki/
Nクイーン問題(20)第五章 並列処理
https://suzukiiichiro.github.io/posts/2023-05-23-02-n-queens-suzuki/
Nクイーン問題(19)第五章 キャリーチェーン
https://suzukiiichiro.github.io/posts/2023-05-23-01-n-queens-suzuki/
Nクイーン問題(18)第四章 エイト・クイーンノスタルジー
https://suzukiiichiro.github.io/posts/2023-04-25-01-n-queens-suzuki/
Nクイーン問題(17)第四章 偉人のソースを読む「N24を発見 Jeff Somers」
https://suzukiiichiro.github.io/posts/2023-04-21-01-n-queens-suzuki/
Nクイーン問題(16)第三章 対象解除法 ソース解説
https://suzukiiichiro.github.io/posts/2023-04-18-01-n-queens-suzuki/
Nクイーン問題(15)第三章 対象解除法 ロジック解説
https://suzukiiichiro.github.io/posts/2023-04-13-02-nqueens-suzuki/
Nクイーン問題(14)第三章 ミラー
https://suzukiiichiro.github.io/posts/2023-04-13-01-nqueens-suzuki/
Nクイーン問題(13)第三章 ビットマップ
https://suzukiiichiro.github.io/posts/2023-04-05-01-nqueens-suzuki/
Nクイーン問題(12)第二章 まとめ
https://suzukiiichiro.github.io/posts/2023-03-17-02-n-queens-suzuki/
Nクイーン問題(11)第二章 配置フラグの再帰・非再帰
https://suzukiiichiro.github.io/posts/2023-03-17-01-n-queens-suzuki/
Nクイーン問題(10)第二章 バックトラックの再帰・非再帰
https://suzukiiichiro.github.io/posts/2023-03-16-01-n-queens-suzuki/
Nクイーン問題(9)第二章 ブルートフォースの再帰・非再帰
https://suzukiiichiro.github.io/posts/2023-03-14-01-n-queens-suzuki/
Nクイーン問題(8)第一章 まとめ
https://suzukiiichiro.github.io/posts/2023-03-09-01-n-queens-suzuki/
Nクイーン問題(7)第一章 ブルートフォース再び
https://suzukiiichiro.github.io/posts/2023-03-08-01-n-queens-suzuki/
Nクイーン問題(6)第一章 配置フラグ
https://suzukiiichiro.github.io/posts/2023-03-07-01-n-queens-suzuki/
Nクイーン問題(5)第一章 進捗表示テーブルの作成
https://suzukiiichiro.github.io/posts/2023-03-06-01-n-queens-suzuki/
Nクイーン問題(4)第一章 バックトラック
https://suzukiiichiro.github.io/posts/2023-02-21-01-n-queens-suzuki/
Nクイーン問題(3)第一章 バックトラック準備編
https://suzukiiichiro.github.io/posts/2023-02-14-03-n-queens-suzuki/
Nクイーン問題(2)第一章 ブルートフォース
https://suzukiiichiro.github.io/posts/2023-02-14-02-n-queens-suzuki/
Nクイーン問題(1)第一章 エイトクイーンについて
https://suzukiiichiro.github.io/posts/2023-02-14-01-n-queens-suzuki/

書籍の紹介

Nクイーン問題(94)Python/Codonで爆速プログラミング ノードレイヤー+ミラー

Nクイーン問題(94)Python/Codonで爆速プログラミング ノードレイヤー+ミラー

Nクイーン問題(92)Python/Codonで爆速プログラミング ビットでミラー+対象解除法

Nクイーン問題(92)Python/Codonで爆速プログラミング ビットでミラー+対象解除法