| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 529 人关注过本帖
标题:正交拉丁方的构造
只看楼主 加入收藏
自学的数学
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:603
专家分:2418
注 册:2017-11-15
结帖率:95.65%
  问题点数:0  回复次数:2   
正交拉丁方的构造
正交拉丁方的有关知识,请参见:
https://baike.baidu.com/item/%E6%AD%A3%E4%BA%A4%E6%8B%89%E4%B8%81%E6%96%B9/7209317?fr=aladdin
    现在要讨论的是:正交拉丁方怎样构造?它们有多少个?现在已经找到了一些方法解决了特殊情况下的构造问题。
    一般地,我们用N(n)表示n阶正交拉丁方组(其中每两个拉丁方都是正交的)中所含拉丁方的最多个数。
    N(5)=4,4个5阶拉丁方就组成了一个正交拉丁方组,是所有正交拉丁方组个数最多的了。提示:这4个5阶拉丁方是:

5 4 3 2 1   5 3 1 4 2    5 2 4 1 3     5 1 2 3 4
4 3 2 1 5   4 2 5 3 1    4 1 3 5 2     4 5 1 2 3
3 2 1 5 4   3 1 4 2 5    3 5 2 4 1     3 4 5 1 2
2 1 5 4 3   2 5 3 1 4    2 4 1 3 5     2 3 4 5 1
1 5 4 3 2   1 4 2 5 3    1 3 5 2 4     1 2 3 4 5
 
好了,请问如何用编程来完成计算 N(5)=4,并将这4个5阶拉丁方找出来,当然哦,这4个5阶拉丁方已经给出了,如果能用此方法找出N(7) 或 N(8)就好了(N(6)是不成在的)。
2018-08-06 17:53
自学的数学
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:603
专家分:2418
注 册:2017-11-15
  得分:0 
为啥 N(6)是不成在的:
因为
    即从不同的6个军团各选6种不同军阶的6名军官共36人,排成一个6行6列的方队,使得各行各列的6名军官恰好来自不同的军团而且军阶各不相同,应如何排这个方队?如果用(1,1)表示来自第一个军团具有第一种军阶的军官,用(1,2)表示来自第一个军团具有第二种军阶的军官,用(6,6)表示来自第六个军团具有第六种军阶的军官,则欧拉的问题就是如何将这36个数对排成方阵,使得每行每列的数无论从第一个数看还是从第二个数看,都恰好是由1、2、3、4、5、6组成。历史上称这个问题为三十六军官问题。
    三十六军官问题提出后,很长一段时间没有得到解决,直到20世纪初才被证明这样的方队是排不起来的。尽管很容易将三十六军官问题中的军团数和军阶数推广到一般的n的情况,而相应的满足条件的方队被称为n阶欧拉方。欧拉曾猜测:对任何非负整数t,n=4t+2阶欧拉方都不存在。t=1时,这就是三十六军官问题,而t=2时,n=10,数学家们构造出了10阶欧拉方,这说明欧拉猜想不对。但到1960年,数学家们彻底解决了这个问题,证明了n=4t+2(t≥2)阶欧拉方都是存在的。
2018-08-06 18:09
自学的数学
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:603
专家分:2418
注 册:2017-11-15
  得分:0 
先构造一个拉丁方:
#include <stdio.h>
main()
{
    int i,j,k,p=5,q;
   
    for(q=1; q<=p; q++)
    {
        for(i=q; i<=p; i++)
        {
            for(j=i; j<=p; j++)
            {
                printf("%2d",j);
            }
            if(i!=1)
            {
                for(k=1; k<=i-1; k++)
                {
                    printf("%2d",k);
                }
            }
            printf("\n");
        }
        if(q!=1)
        {
            for(i=1; i<=q-1; i++)
            {
                for(j=i; j<=p; j++)
                {
                    printf("%2d",j);
                }
                if(i!=1)
                {
                    for(k=1; k<=i-1; k++)
                    {
                        printf("%2d",k);
                    }
                }
                printf("\n");
            }
        }
        printf("\n");
    }
}
2018-08-07 11:16







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032914 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved