前导:

罗伯法的口诀:

1、奇数阶幻方

2、双偶阶幻方

3、单偶阶幻方

自动生成幻方密钥:


前导:

幻方加密是基于罗伯法的填数自动生成阶级数阵来作为密钥,要明白幻方加密,首先就要先了解罗伯法的规律,编写代码时幻方加密的情况分为了3种情况,基数阶的填数,单偶与双偶阶,本篇实现幻方加密代码是基于python编写

先了解一下什么是幻方阶

阶幻方,每一行、每一列、两对角线上的数之和相等。当n为奇数时,我们称幻方为奇阶幻方。法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。图1就是一个用罗伯法排好的5阶幻方

罗伯法的口诀:

(初学者可先画出一个N×N的方格阵)

1 居上行正中央——数字 1 放在首行最中间的格子中

依次斜填切莫忘——向右上角斜行,依次填入数字

上出框界往下写——如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中

右出框时左边放——同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中

重复便在下格填——如果数字{N} 右上的格子已被其它数字占领,就将{N+1} 填写在{N}下面的格子中

右上重复一个样——如果朝右上角出界,和“重复”的情况做同样处理

1、奇数阶幻方

n为奇数 【n=3,5,7,9,11……】 【n=2×k+1,k=1,2,3,4,5……)】
奇数阶幻方最经典的填法是罗伯特法【也有人称之为楼梯法】

填写方法是这样:
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n×n-1个数:

(1)每一个数放在前一个数的右上一格;
(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)如果这个数所要放的格已经有数填入,处理方法同(4)。
这种写法总是先向“右上”的方向,象是在爬楼梯。

2、双偶阶幻方

n为偶数,且能被4整除 【n=4,8,12,16,20…】 【n=4k,k=1,2,3,4,5…】
先说明一个定义。互补:如果两个数字的和,等于幻方最大数和最小数的和,即 n*n+1,称为互补。
        先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写:

这个方阵的对角线,已经用颜色标出。将对角线上的数字,换成与它互补(同色)的数字。
这里,n×n+1 = 4×4+1 = 17;把1换成17-1 = 16;把6换成17-6 = 11;把11换成17-11 = 6……换完后就是一个四阶幻方。
        对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按4*4把它划分成k*k个方阵。因为n是4的倍数,一定能用4*4的小方阵分割。然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。

3、单偶阶幻方

n为偶数,且不能被4整除 【n=6,10,14,18,22…】 【n=4k+2,k=1,2,3,4,5…】
这是三种里面最复杂的幻方。
以n=10为例。这时,k=2

(1) 把方阵分为A,B,C,D四个象限,这样每一个象限肯定是奇数阶。用楼梯法,依次在A象限,D象限,B象限,C象限按奇数阶幻方的填法填数。

(2) 在A象限的中间行、中间格开始,按自左向右的方向,标出k格。A象限的其它行则标出最左边的k格。将这些格,和C象限相对位置上的数,互换位置。

(3) 在B象限任一行的中间格,自右向左,标出k-1列。(注:6阶幻方由于k-1=0,所以不用再作B、D象限的数据交换),将B象限标出的这些数,和D象限相对位置上的数进行交换,就形成幻方。

自动生成幻方密钥:

复制代码前,先把文件创建好,把代码的路径设置好,如果只需要输出幻方,可以把文件部分直接改成输出即可。

import numpy as np#列表循环向左移offset位
def shift_left(lst, offset):return [lst[(i+offset)%len(lst)] for i in range(len(lst))]#列表循环向右移offset位
def shift_right(lst, offset):return [lst[i-offset] for i in range(len(lst))]#构造奇数阶幻方函数
def magic_of_odd_order(n):p = (int)((n-1)/2)#创建矩阵1initial_lst1 = list(range(p+1,n))+list(range(p+1))initial_mat1 = []for i in range(n):initial_mat1.append(shift_left(initial_lst1, i))mat1 = np.array(initial_mat1)#创建矩阵2initial_lst2 = list(range(p,-1,-1))+list(range(2*p,p,-1))initial_mat2 = []for i in range(n):initial_mat2.append(shift_right(initial_lst2, i))mat2 = np.array(initial_mat2)#创建矩阵3,即元素全为1的矩阵mat3= np.ones((n,n),dtype=np.int_)#构造幻方magic = n*mat2+mat1+mat3return magic#构造4n阶幻方函数
def magic_of_4n_order(n):mat = np.array(range(1,n*n+1)).reshape(n,n)for i in range((int)(n/4)):for j in range((int)(n/4)):for k in range(4): #将每个4*4小方块的对角线换成互补元素mat[k+4*j][k+4*i] = n*n+1-mat[k+4*j][k+4*i]mat[k+4*j][3-k+4*i] = n*n+1-mat[k+4*j][3-k+4*i]return mat#构造4n+2阶幻方函数
def magic_of_4n2_order(n):p = (int)(n/2)matA = magic_of_odd_order(p)matD = matA+p**2matB = matD+p**2matC = matB+p**2#交换矩阵块A与矩阵块C中特定元素的位置row = (int)((p-1)/2)for i in range(p):if i != row:for k in range((int)((n-2)/4)):matA[i][k],matC[i][k] = matC[i][k],matA[i][k]else:for k in range((int)((n-2)/4)):matA[i][row+k],matC[i][row+k] = matC[i][row+k],matA[i][row+k]col = (int)((p-1)/2)for j in range(col+2-(int)((n-2)/4),col+1):for i in range(p):matB[i][j],matD[i][j] = matD[i][j],matB[i][j]magic = np.row_stack((np.column_stack((matA,matB)),np.column_stack((matC,matD))))return magic
n1=[]
def main():order = eval(input('输入幻方阶数(>=3): '))if order%2 ==1:magic = magic_of_odd_order(order)elif order%4 == 0:magic = magic_of_4n_order(order)else:magic = magic_of_4n2_order(order)print('生成幻方 %d 阶......'%order)for row in magic:for col in row:n1.append(col)print(col, end='\t')print()#验证生成的magic是否为幻方 val = input(("是否进行验算?[Y|N]"))if val == 'Y' or val == 'y':print('每行的和:', np.sum(magic, axis=0))print('每列的和:', np.sum(magic, axis=1))print('主对角线的和:', sum([magic[i][i] for i in range(order)]))print('副对角线的和:', sum([magic[i][order-1-i] for i in range(order)]))main()f = open(r"C:\Users\hanhu\Desktop\加密解密\明文.txt", "r")
a=f.read().split()
f.close()
#a=str(a)
#a=input().split()
b=list(map(int,n1))
k=dict.fromkeys(b,' ')
for i in range(len(n1)-len(a)):a.append(' ')
for i in range(len(k)):k[b[i]]=a[i]
l=""
for i in range(len(k)):l+=k[i+1]+' '
l=l[:-1]
f = open(r"C:\Users\hanhu\Desktop\加密解密\幻方密文.txt", "w")
f.write(l)
f.close()

执行:

幻方加密代码——自动生成幻方密钥方法,罗伯法单偶数阶的解法代码基于python相关推荐

  1. lin通信ldf文件解析_基于LIN协议的代码自动生成系统及方法_2014108531085_说明书_专利查询_专利网_钻瓜专利网...

    技术领域 本发明属于汽车电子LIN网络通讯领域,公开了一种利用LDF文件自动生成LIN通讯软件代码的方法. 背景技术 目前汽车电子产品的软件开发逐渐向模块化.标准化.集成化.自动化发展.LIN通讯模块 ...

  2. python生成yaml_使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} ...

  3. 奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻方)

    奇数阶矩阵,横竖斜加起来都相等: 给定奇数N,形成N阶矩阵,使得横竖斜加起来都相等.比如N=3: 08 01 06 03 05 07 04 09 02 每一行,每一列,交叉斜加起来都等于15 算法思路 ...

  4. 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(TableGo v7.4.0版)

    TableGo_20210921 v7.4.0 正式版发布,此次版本累计更新如下:           1.新增企业或个人的简单定制版本,为企业和个人提供软实力的增值           2.新增导入 ...

  5. 自定义Android注解Part2:代码自动生成

    上一期我们已经把butterknife-annotations中的注解变量都已经定义好了,分别为BindView.OnClick与Keep. 如果你是第一次进入本系列文章,强烈推荐跳到文章末尾查看上篇 ...

  6. Mybatis最入门---代码自动生成(generatorConfig.xml配置)

    [一步是咫尺,一步即天涯] 经过前文的叙述,各位看官是不是已经被Mybatis的强大功能给折服了呢?本文我们将介绍一个能够极大提升我们开发效率的插件:即代码自动生成.这里的代码自动生成包括,与数据库一 ...

  7. html自动生成工具_关于STM32代码自动生成的工具的进度....

    前情提要:STM32代码自动生成工具_本想...但是...可是...所以 首先说一下那几天大家的反应,有的持观望态度,毕竟STM32CUBE很香:有的很激动,期待我快点出东西:还有的很淡定,知道我在挖 ...

  8. Spring Boot (七)MyBatis代码自动生成和辅助插件

    一.简介 1.1 MyBatis Generator介绍 MyBatis Generator 是MyBatis 官方出品的一款,用来自动生成MyBatis的 mapper.dao.entity 的框架 ...

  9. java代码自动生成的插件_如何使用插件生成自定义Java 8代码

    java代码自动生成的插件 大多数程序员讨厌的一件事就是编写样板代码. 无休止的时间花费在设置实体类和配置数据库连接上. 为了避免这种情况,您可以让Speedment Open Source之类的程序 ...

最新文章

  1. 【VMCloud云平台】SCO(四)流程准备
  2. 初创公司为什么要我_在一家大型初创公司担任副总裁之前,我希望知道什么
  3. python服务器同步
  4. LINQ学习(六):OrderBy/Group By子句
  5. java读取src路径下的txt文件_Java程序使用Maven后无法运行?
  6. 如何设置jinternalframe无边框_word文档美化技巧:加个边框提升版面颜值
  7. python 虚拟环境 mac,Mac下python 虚拟环境安装
  8. mysql的骚操作:自增长的字段同时插入到另一个字段
  9. python绘制汉字_OpenCV Python 绘制中文字
  10. 【Spark】Spark kafka because consumer rebalance same group id joined different streaming
  11. 修改linux终端的提示字符
  12. 523. 连续的子数组和
  13. 惠普p1106打印机安装步骤_惠普p1106打印机驱动程序下载
  14. H5小游戏源码在哪里可以免费获取?
  15. 本地化部署方案 VS 云托管方案
  16. cisco 2800路由器密码恢复
  17. 做服务器销售两个月还没开单,1月15日的销售欠款,2月20日做的收款单,为什么没有...
  18. 面试题27-二叉树的镜像
  19. pta统计字符出现次数
  20. 高等数学与matlab要用电脑吗,知到高等数学与MATLAB启蒙答案全套

热门文章

  1. 致 Tapdata 开源贡献者:聊聊 2022 年的进展和新一年的共建计划
  2. 读《Boost程序库完全开发指南》
  3. div 添加失焦事件
  4. 《算法笔记》2.3小节——C/C++快速入门-选择结构
  5. 信息安全技术网络安全等级保护基本要求-结构变化
  6. tensorflow+python flask进行手写识别_python+flask搭建CNN在线识别手写中文网站!简直太屌了!...
  7. 银行招考计算机专业考什么,银行笔试一般都考什么?
  8. 今天开始做战斗,回合制战斗代码实现第一篇补充,从头开始,简单的2d回合制游戏一些文档方面的知识
  9. 【图像分类】实战——使用ResNet实现猫狗分类(pytorch)
  10. 学习笔记 | Orillusion-WebGPU小白入门(六)