偶阶幻方的算术构造

2024-02-08 02:10
文章标签 构造 算术 幻方 偶阶

本文主要是介绍偶阶幻方的算术构造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文介绍的任意偶阶幻方的构造方法,无需考虑单偶、双偶,也不需要高等数学基础。与许多其他方法比较,或有新意。仅有初等数学基础,就可方便构造。

——求质疑!

一、构造方法

本法构造的幻方,先根据几条通项公式,求得坐标轴上的1至n²自然数列中的部分数后,再依据本法的排列规则,可简便填充该数列其余所有的数字。

先把给定数列最小和最大的8个数,建立一个4阶幻方,作为任意n阶幻方的中心。以该4阶幻方为中心,建立两条平行的横坐标轴B、C轴,再在两条对角线位置建立两条斜坐标轴A、D轴(图一,坐标上的点,用格子代替,以便填数)在这里插入图片描述

通过如下坐标轴通项公式

Nₘ=2m²-J(m-1)+1

(Jb=2,Jc=3,Jd=4,m=3,4,…)

Aₘ=2m² ( m=3,4,…)

Nₘ'=H- Nₘ, Aₘ'=H- Aₘ

确定各坐标轴正方向上的数字,而所有负方向上的数字,由互补的关系求得。再参照图例所示的排列规律,依次填写,即可方便得到任意偶阶幻方。

上述各式中,Nₘ表示各个坐标轴要填的数;J称初进数,对应B、C、D轴,J分别为2、3、4; m是各坐标格子序号,因为中心4阶幻方,已经占了格子序号1、2,所以m从3始取;H叫互补数,定义H=n²+1。也就是说,任何两个数之和为H,则称这两个数互补。 可以证明,由此方法得到的偶阶幻方,每一行、每一列及两条对角线上的数字之和

∑= n(1+ n²)/2

均相等,满足幻方的要求。

特别提示:

1、Ⅰ区域Dₘ+2等数字,包含在Ⅲ区域取数范围(Dₘ﹤Nₘ﹤Bₘ-1)内。当m =5,7,9,…时,这组数字中有且仅有一个数字(加m-1时),会跟C轴同序号的数字重复。处理的原则是,不许动C轴数字,在取数范围内,把本区域的这个重复数加1或减1,而把该数前后(均可)的数减1或加1,以避免重复且保持总和不变。实际上,Ⅰ区域要填的数,用Dₘ+2和(Dₘ+2)+2,…等,只是限制了总和与个数,填什么数是不影响结果的。

2、 严格按上述原则填完Ⅰ区域后,剩余在取数范围Dₘ﹤Nₘ﹤Bₘ-1内的数字,恰能填充Ⅲ区域。可以证明,这个范围的数字个数,恰好对应所有的空格。填充Ⅲ区域时,务须注意避免重复,无需顾虑影响总和(可证)。

二、幻和的证明

本幻方的编排特点,先由通项公式求得坐标上的数字,再结合排列规律,确定一系列关键点的数字,最后利用对应格子上的数字互补的关系,求得其他空格应填的数字。

为了表述的方便,我们把所给1→n²自然数,两分其为1→n/2,(n/2)+1→n²两部分,称N≤n/2的数为小数,称N>n/2的数为大数。由于由通项公式(Nₘ=2m²-J(m-1)+1等)决定的小数,仅是坐标序号m的函数,不含有与阶数有关的n因子,所以,小数的位置不因阶数的变化而变化;大数的数值由互补关系求得,相同的大数(Nₘ'=H - Nₘ,H=n²+1),会随所取阶数的不同而出现在不同的位置。

特别值得注意的是,本幻方的两斜轴(A、D),把幻方分为四个对顶的三角形区域。互为对顶的两个区域的数字,是关于中心线互补的;四条坐标轴上的数字,是关于中心点互补的;中心4阶幻方的幻和是2 H。明确这些关系,会使证明容易得多。

下面,我们就从最难下手的最下面一行开始证明。这一

这篇关于偶阶幻方的算术构造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689625

相关文章

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

leetcode刷题(97)——106. 从中序与后序遍历序列构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3/ \9 20/ \15 7 看下后序和中序遍历的框架: void traverse(TreeNode root) {trave

leetcode刷题(97)——105. 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7 1.先回顾前序遍历和中序遍历的框架: void traverse(TreeNode root) {//

day16--513.找树左下角的值+112. 路径总和+106.从中序与后序遍历序列构造二叉树

一、513.找树左下角的值 题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/ 文章讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 视频讲解:https://www

构造,析构,垃圾回收

构造函数 基本概念 在实例化对象时 会调用的用于初始化的函数 如果不写,默认存在一个无参构造函数 构造函数的写法 1.没有返回值 2.函数名和类名必须相同 3.没有特殊需求时,一般都是public的 4.构造函数可以被重载 5.this代表当前调用该函数的对象自己 class Person{public string name;public int age;//类中是允许自己

网易构造队列

#include<bits/stdc++.h>using namespace std;int main(){int T;cin>>T;while(T--){int n;cin>>n;vector<int>v;queue<int>Q;int i,j;for(i=0; i<n; i++)Q.push(i);while(!Q.empty()) //队列不空,执行循环{in

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-14模型构造

14模型构造 import torchfrom torch import nnfrom torch.nn import functional as F#通过实例化nn.Sequential来构建我们的模型, 层的执行顺序是作为参数传递的net1 = nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256,10))"""nn.

Studying-代码随想录训练营day16| 513找到左下角的值、112.路径总和、106从中序与后序遍历序列构造二叉树

第十六天,二叉树part03💪💪💪,编程语言:C++ 目录 513找到左下角的值 112.路径总和 113.路径总和II 106从中序与后序遍历序列构造二叉树  105.从前序与中序遍历序列构造二叉树  总结  513找到左下角的值 文档讲解:代码随想录找到左下角的值 视频讲解:手撕找到左下角的值 题目: 学习:注意是找到最底层最左边的值,而不是找到最左边

构造数组的MaxTree(二叉树)

举个例子如下: 实现的代码如下: import java.util.Stack;import java.util.HashMap;//构造数组的MaxTreepublic class MaxTree{//二叉树结点的定义如下public static class Node{public int value;public Node left;public Node righ