拉丁方(数独)的构造方法

文章目录

  • 拉丁方(数独)的构造方法
  • 前言
  • 一、拉丁方的定义
  • 二、乘法逆元构造法
  • 三、两个低阶构造高阶法
  • 总结

前言

因为最近在学习组合数学,里面有专门的一个章节是阐述拉丁方的来源、构造,欧拉提出了是否存在6阶的正交拉丁方问题,欧拉猜测:对应整数6、10、14、16、4k+2、…不存在相应阶数的拉丁方。早在1901年,Tarry就用枚举法验证了欧拉猜测的正确性。(1901年中国签订了《辛丑条约》,瑞典首次颁发诺贝尔奖)课本中也阐述了集中构造拉丁方的方法,现将这些方法做一个整理,以供大家参考。(版权侵删)

一、拉丁方的定义

  1. 设 n 为正整数,并设 A 为 n 个不同正整数元素的集合。在集合A上的 n 阶拉丁方是一个 n 行 n 列的数组,他的每一项是 A 的元素,使得 A 的 n 个元素的每一个元素在每一行上出现一次,在每一列上出现一次。
  2. 通常把 A 取为 Z n = { 0 , 1 , ⋯ , n − 1 } \ Z_n = \{0,1,\cdots,n-1\}  Zn​={0,1,⋯,n−1}, Z n \ Z_n  Zn​是指mod n 整数运算
    此时我们把拉丁方的行列计数为0,1, ⋯ \ \cdots  ⋯,n-1,而不是我们经常用的1,2, ⋯ \ \cdots  ⋯,n(1行1列的数组总是只有一个元素组成的拉丁方)
    以下为拉丁方例子: [ 0 1 1 0 ] , [ 0 1 2 1 2 0 2 0 1 ] \begin{bmatrix} 0 & 1\\ 1 & 0 \end{bmatrix}\,, \begin{bmatrix} 0 & 1 & 2 \\ 1 & 2 & 0 \\ 2 & 0 & 1 \end{bmatrix} [01​10​],⎣⎡​012​120​201​⎦⎤​

二、乘法逆元构造法

设 n 是正整数,r 是 Z n \ Z_n  Zn​中的非零整数,是的 r 和 n 的GCD为 1。(即互为逆元)设A 为n 行n 列数组,其 i 行j 列上的元素是
a i j = r ∗ i + j ( m o d n 运 算 ) ( i , j = 0 , 1 , ⋯ , n − 1 ) a_{ij} = r*i+j(mod\ n 运算) \ (i,j=0,1,\cdots,n-1) aij​=r∗i+j(mod n运算) (i,j=0,1,⋯,n−1)
则 A 是 Z n \ Z_n  Zn​上的n 阶拉丁方


三、两个低阶构造高阶法



首先,先用下面4行4列的数组代替 A 1 A_1 A1​中的每一项 a i j 1 a^1_{ij} aij1​

再按字典序将此数组内的序偶数与0到11的数进行一一对应,便由一个3阶和一个4阶的低阶拉丁方,生成了一个12阶的高阶拉丁方,对应关系如下:


由 A 1 A_1 A1​和 B 1 B_1 B1​生成的12阶拉丁方如下:

由 A 2 A_2 A2​和 B 2 B_2 B2​生成的12阶拉丁方如下:

总结

以上就是生成拉丁方的方法,对于我们平常做的数独游戏,通常都是由以上两种方法构造出来的,关键点在于 r 的选择,不同的 r 构造出不同的拉丁方。解数独的精髓就是紧紧把握拉丁方的定义(即每行每列不会出现重复的元素),祝各位在数独路上收货快乐!

拉丁方(数独)的构造方法相关推荐

  1. puzzle(105)幻方、幻圆、拉丁方

    目录 〇,幻方 一,幻方的轮胎模型 二,奇数阶幻方的构造法 1,罗伯构造法 2,罗伯构造法的推广 3,巴舍构造法(平移补空法) 4,轮换叠加构造法 三,偶数阶幻方 四,幻立方 1,幻立方 2,完美幻立 ...

  2. 谈谈数独(Sudoku)

    谈谈 Sudoku (数独) 除特别说明外,本文提到的Sudoku是指9x9的经典Sudoku.本文大量参考了维基百科的相关条目. Sudoku 介绍 Sudoku 是一种数学游戏,把一个9行9列的棋 ...

  3. 组合数学(4)——拉丁方矩阵

    这次,我们讲一讲拉丁方和正交拉丁方,相关性质及其应用. 1. 拉丁方及正交拉丁方 拉丁方指的是一种 n × n 的方阵,在这种 n ×n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同 ...

  4. puzzle(0142)幻圆、拉丁方

    目录 一,幻圆 1,直径幻圆 2,半径幻圆 二,拉丁方 1,拉丁方 2,正交拉丁方 一,幻圆 1,直径幻圆 要求每一个圆圈的数字之和相等,每一条直径的数字之和相等. 这里面是1-49,除掉25之外是6 ...

  5. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  6. kotlin重写构造方法编译报错:Primary constructor call expected

    在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...

  7. Java 构造方法与成员方法的区别

    学而时习之,温故而知新. 先说下自己怎样区分它们 认定构造方法是:类名与构造方法相同,这个方法就是构造方法, 这个类中除了构造方法以外的方法都是成员方法,原因是在类中除了变量外的基本都是成员方法. 看 ...

  8. private关键字和构造方法

    1.private: A: 是一个修饰符 B:可以 修饰成员变量,也可以修饰成员方法 C:被private修饰的成员只能在本类中访问 D:针对private修饰的成员变量,可以用getXxx()和se ...

  9. 构造方法与setXxx方法

    构造方法:给属性进行初始化 Person p=new Person("kobe",23); p=new Person("KG",24);这种方式貌似看起来是改名 ...

最新文章

  1. 简单总结一下 XSS
  2. Java调优之jvm和线程的内存分析
  3. Field-Symbols总结
  4. java怎么用柱形图_java绘制柱形图
  5. PHP页面运行一半,在PHP中仅缓存页面的一部分
  6. java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...
  7. Android 第三章 SQLite 数据库
  8. 最长回文子串-----Manacher算法
  9. sqlServer 如何查看数据库日志文件的大小
  10. maya中英转换插件1.2 及教程
  11. android 广告库sdk,秒针移动广告投放Android SDK集成指南
  12. 闭环系统的零极点图判定稳定性_零极点与系统稳定关系 拉氏变换的收敛域...
  13. 手机和工业计算机运算能力对比,手机cpu和电脑cpu差距有多大_手机cpu跟电脑cpu差多少...
  14. dubbo整合springboot图解版(九)
  15. 【前端框架】前端框架学习
  16. 【BAT】修改指定的文件名称为系统当前日期
  17. 回文数—简单方法(C语言)
  18. 查看Window系统激活信息
  19. 线程进程是怎样使用多核的
  20. python 在Windows下 用软回车换行

热门文章

  1. Eviews笔记-回归分析【自用】
  2. C++ strIcmp 字符串大小比较
  3. 8个动作帮你腰部快速塑形
  4. 纯净版Win10系统重装教程(超详细)
  5. 漏洞预警| vm2 任意代码执行漏洞
  6. Android adb push后相册没有立马更新,需要刷新media库
  7. VBA编程中常用过程代码
  8. ERROR: cannot launch node of type [joint_state_publisher_gui/joint_state_publisher_gui]
  9. html输出转成word(转)
  10. python 小程序搜索排名优化_5个Python脚本优化你的网站搜索引擎优化