拉丁方(数独)的构造方法
拉丁方(数独)的构造方法
文章目录
- 拉丁方(数独)的构造方法
- 前言
- 一、拉丁方的定义
- 二、乘法逆元构造法
- 三、两个低阶构造高阶法
- 总结
前言
因为最近在学习组合数学,里面有专门的一个章节是阐述拉丁方的来源、构造,欧拉提出了是否存在6阶的正交拉丁方问题,欧拉猜测:对应整数6、10、14、16、4k+2、…不存在相应阶数的拉丁方。早在1901年,Tarry就用枚举法验证了欧拉猜测的正确性。(1901年中国签订了《辛丑条约》,瑞典首次颁发诺贝尔奖)课本中也阐述了集中构造拉丁方的方法,现将这些方法做一个整理,以供大家参考。(版权侵删)
一、拉丁方的定义
- 设 n 为正整数,并设 A 为 n 个不同正整数元素的集合。在集合A上的 n 阶拉丁方是一个 n 行 n 列的数组,他的每一项是 A 的元素,使得 A 的 n 个元素的每一个元素在每一行上出现一次,在每一列上出现一次。
- 通常把 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} [0110],⎣⎡012120201⎦⎤
二、乘法逆元构造法
设 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 构造出不同的拉丁方。解数独的精髓就是紧紧把握拉丁方的定义(即每行每列不会出现重复的元素),祝各位在数独路上收货快乐!
拉丁方(数独)的构造方法相关推荐
- puzzle(105)幻方、幻圆、拉丁方
目录 〇,幻方 一,幻方的轮胎模型 二,奇数阶幻方的构造法 1,罗伯构造法 2,罗伯构造法的推广 3,巴舍构造法(平移补空法) 4,轮换叠加构造法 三,偶数阶幻方 四,幻立方 1,幻立方 2,完美幻立 ...
- 谈谈数独(Sudoku)
谈谈 Sudoku (数独) 除特别说明外,本文提到的Sudoku是指9x9的经典Sudoku.本文大量参考了维基百科的相关条目. Sudoku 介绍 Sudoku 是一种数学游戏,把一个9行9列的棋 ...
- 组合数学(4)——拉丁方矩阵
这次,我们讲一讲拉丁方和正交拉丁方,相关性质及其应用. 1. 拉丁方及正交拉丁方 拉丁方指的是一种 n × n 的方阵,在这种 n ×n 的方阵里,恰有 n 种不同的元素,每一种不同的元素在同一行或同 ...
- puzzle(0142)幻圆、拉丁方
目录 一,幻圆 1,直径幻圆 2,半径幻圆 二,拉丁方 1,拉丁方 2,正交拉丁方 一,幻圆 1,直径幻圆 要求每一个圆圈的数字之和相等,每一条直径的数字之和相等. 这里面是1-49,除掉25之外是6 ...
- kotlin中继承父属性使用构造方法
kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...
- kotlin重写构造方法编译报错:Primary constructor call expected
在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...
- Java 构造方法与成员方法的区别
学而时习之,温故而知新. 先说下自己怎样区分它们 认定构造方法是:类名与构造方法相同,这个方法就是构造方法, 这个类中除了构造方法以外的方法都是成员方法,原因是在类中除了变量外的基本都是成员方法. 看 ...
- private关键字和构造方法
1.private: A: 是一个修饰符 B:可以 修饰成员变量,也可以修饰成员方法 C:被private修饰的成员只能在本类中访问 D:针对private修饰的成员变量,可以用getXxx()和se ...
- 构造方法与setXxx方法
构造方法:给属性进行初始化 Person p=new Person("kobe",23); p=new Person("KG",24);这种方式貌似看起来是改名 ...
最新文章
- 简单总结一下 XSS
- Java调优之jvm和线程的内存分析
- Field-Symbols总结
- java怎么用柱形图_java绘制柱形图
- PHP页面运行一半,在PHP中仅缓存页面的一部分
- java前沿技术_互联网百强企业架构师告诉你,Java应该这么学!云和数据超全面Java中级程序员学习路线图重磅发布!...
- Android 第三章 SQLite 数据库
- 最长回文子串-----Manacher算法
- sqlServer 如何查看数据库日志文件的大小
- maya中英转换插件1.2 及教程
- android 广告库sdk,秒针移动广告投放Android SDK集成指南
- 闭环系统的零极点图判定稳定性_零极点与系统稳定关系 拉氏变换的收敛域...
- 手机和工业计算机运算能力对比,手机cpu和电脑cpu差距有多大_手机cpu跟电脑cpu差多少...
- dubbo整合springboot图解版(九)
- 【前端框架】前端框架学习
- 【BAT】修改指定的文件名称为系统当前日期
- 回文数—简单方法(C语言)
- 查看Window系统激活信息
- 线程进程是怎样使用多核的
- python 在Windows下 用软回车换行
热门文章
- Eviews笔记-回归分析【自用】
- C++ strIcmp 字符串大小比较
- 8个动作帮你腰部快速塑形
- 纯净版Win10系统重装教程(超详细)
- 漏洞预警| vm2 任意代码执行漏洞
- Android adb push后相册没有立马更新,需要刷新media库
- VBA编程中常用过程代码
- ERROR: cannot launch node of type [joint_state_publisher_gui/joint_state_publisher_gui]
- html输出转成word(转)
- python 小程序搜索排名优化_5个Python脚本优化你的网站搜索引擎优化