排列与逆序对

一个大小为n的排列是指1~n每个数都恰好出现一次的排列,(有些地方采用0~n-1,不影响);逆序对是指任意一个二元组(ai,aj)满足i>j&&ai<aj。

 

1.大小为n的排列共有n!种。只有自然排列(就是指1~n)没有逆序对,其他排列都有逆序对。逆序对的上限是n*(n-1)/2,下限是0。

2.有逆序对则必定有相邻的逆序对:证明:假设存在一对ai,aj满足i+1<j&&ai>aj的二元组,且不存在其他逆序对,则必须有ai<ai+1<ai+2…<aj-1。但是aj-1>ai>aj故aj-1,aj为一对相邻的逆序对,故假设错误。

3.n!种排列中逆序对个数为奇数的和偶数的都恰好为n!/2:证明:先将排列的后n-2的元素确定,最后确定a1,a2。然后交换a1,a2就可以改变奇偶的另一个排列。

4.交换相邻的两个元素,逆序对个数奇偶性改变。

5.任意一个排列,如果只能交换相邻的两个数,那么至少要交换逆序对个数,才能将排列变成自然排列:证明,每次交换相邻的逆序对,每交换一次,逆序对个数减少1,直到没有逆序对为止。

6.任意一个排列,如果能任意交换,那么交换变成自然排列的次数与逆序对个数的奇偶性相同。证明:交换任意两个元素ai,aj(不妨设i<j)。等价于交换(ai,ai+1),(ai+1,ai+2)…(aj-2,aj-1),(aj-1,aj),(aj-1,aj-2)…(ai+2,ai+1),(ai+1,ai)。总共2*(j-i)-1次,即奇数次,所以任意交换两个数一次,相当于交换奇数次相邻的元素。

7.对于一个排列a,设逆序对个数为m。我们将a反转,或把ai变成n+1-ai,逆序对个数将变为n*(n-1)/2-m即原本为逆序对二元组的变成了非逆序对,原本不是逆序对的变成了逆序对。那么当n为4k或4k+1的整数时,逆序对个数奇偶性不变,n为4k+2或4k+3时,逆序对个数奇偶性改变。

8.对于一个排列a,如果把第一个数移动到最后一个数后面,或者把最后一个数移动到前面(即任意方向循环位移一次),如果n为奇数,逆序对个数奇偶性不变,否则改变:证明,先证明把第一个数移动到最后一位后面:在a2~an这n-1个数中,假设比a1大的有k个,那么比a1小的就有n-1-k个。移动之后逆序对将增加2k-n+1个。

对于最后一个数移动到前面这种情况也同理可证。

9.给定排列a,令b[a[i]]=i,这样会得另一个排列b,这个b叫做a的排列的逆。描述a中每个元素的所在位置。比如a=[2,3,1,5,4],b=[3,1,2,5,4],我们可以说:在a中,a[i]排在第b[a[i]]位。如a中3排在第2位。

10.排列的逆与原排列互为逆:证明:给定a,令b[a[i]]=i,则b为a的逆排列,下面证明a也为b的逆排列。如果b[a[i]]=i那么b[i]就等于a中满足a[j]=i的那个j。即b[i]=b[a[j]]=j。这样a[b[i]]=a[j]=i。

还有一种通俗的证明就是每个排列会对应一个矩阵,排列的置换其实是一种矩阵乘法(满足每行每列恰好有一个1,其余为0的n阶矩阵),由于矩阵与矩阵的逆互为逆,所以a与b互为逆。

(其实矩阵的证明才是严谨证明)

11.排列的逆与原排列有相同个数的逆序对:证明:对于原排列任意二元组(ai,aj)不妨设i<j。那么在逆排列中,必有b[a[j]]=j>i=b[a[i]]。如果ai>aj,则a中记为逆序对,b中二元组(b[a[j]],b[a[i]])也记为逆序对;同理ai<aj,则a中不记逆序对,b中二元组(b[a[j]],b[a[i]])也不记逆序对。可以说a与b的逆序对二元组存在一一对应的关系。

12.定义一个奇偶函数:s(a)=1,a的逆序对个数为偶数;-1,a的逆序对个数为奇数。现在给定两个大小为n的排列a,b,再令c[i]=a[b[i]],则有s(c)=s(a)*s(b)。证明:我们另外构建一个自然排列1-n,记为d,让他和a每位绑定在一起。那么把d通过交换得到b的同时,a就会得到c。所以c的逆序对个数奇偶性一定和a的交换次数加b的交换次数的和相同。

13.给定一个初始排列a和一个打乱排列b,现将a打乱,记a'[i]=a[b[i]],再把b视为自然排列,就是按照b的顺序视为新的大小顺序,此时计算a’的逆序对个数,则和初始排列a的逆序对个数奇偶性相同。

举个例子,a=[2,3,4,1],逆序对为3,b=[3,1,4,2],则a'=[4,2,1,3]。这个时候我们将b设为新的大小顺序,即3<1<4<2。当然这等价于把a'中的元素a'i变成3,4,2,1。这样逆序对个数是5。5和3奇偶性相同。

证明:上述过程其实是,记一个rank函数表示新的大小关系,rank[b[i]]=i。也就是本来是b[i]的数现在排在第rank[b[i]]位,也就是第i位。最后一步重新赋值就是a''[i]=rank[a'[i]]=rank[a[b[i]]]。可以发现s(a'')=s(rank)*s(a)*s(b)。然而rank与b为互逆排列,故s函数值相等,s(a'')=s(a)*s(b)^2=s(a)。

 

接下来我们设n,m为两个奇素数,考虑一个大小为n*m的排列。并把它依次放到一个大小为n*m的表格里。比如n=5,m=7。那么这个表格就长这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

14.我们把数字横着一个一个捡起来,再竖着一个一个放下去,表格就会变成这样:

1

6

11

16

21

26

31

2

7

12

17

22

27

32

3

8

13

18

23

28

33

4

9

14

19

24

29

34

5

10

15

20

25

30

35

之后再把数字横着一个一个捡起来排成一排,也就是1,6,11,16….25,30,35。把这个排列记为a,那么s(a)=(-1)^[(n-1)*(m-1)/4]。

证明:在同一行或同一列的都不会构成逆序对。只有向“/“方向倾斜的二元组会构成逆序对。记表格第i行第j列元素为eij考虑枚举任意两行i,j,枚举任意两列k,l。二元组(eik,ejl)和二元组(eil,ejk)一定有一个为逆序对,一个不是。所以逆序对总共有n*(n-1)/2*m*(m-1)/2个。由于n,m都为奇数,所以(-1)^(n*m)仍为-1。
       15. 我们把数字竖着一个一个捡起来,再向右下斜着一个一个放下去,当往右下放的时候超出了边界,就跳回第一行/列。比如(5,3)的下一个原本应该是(6,4),但是第六行超出了边界,就跳回第一行,变成(1,4);类似(1,7)的下一个是(2,1)。表格就会变成这样:

1

4

7

3

6

2

5

12

8

11

14

10

13

9

16

19

15

18

21

17

20

27

23

26

22

25

28

24

31

34

30

33

29

32

35

由于我们拿起第i行的数字,最后都会放回第i行,那么每一行就都是原始行的数字,只是顺序改变而已。此时再把整个表格按行一个个捡起来排成一排,记为b;再记这个表格的第一行(一定是1-n的排列)记为a,则a与b的逆序对个数奇偶性相同。

证明:当我们把表格排成一行的时候,会发现不同行之间的元素不会构成逆序对,因为下面行的数字总会大于上面行的数字;下面行的结构其实是上面一行往右循环位移一位,且m为奇数,所以每一行的逆序对个数的奇偶性都是相同的。又因为总共有n行,n为奇数,所以b的逆序对个数奇偶性与a相同。

 

下面我们设3个数组和一个数p:

第一个是a,a[i*n%m]=i。由于表格第一个数永远是1,我们把第一个数去掉,并且将剩下的数全部减一,得到一个大小为m-1的排列。根据上述放置的顺序,我们可以发现,i其实放在了i*n%m位置。所以a其实就是表格的第一行的第2~m个数,然后同时减一,所以s(a)仍然等于s(表格)。

第二个是b,b[i]=g^i%m,其中g为m的一个原根。

第三个是b的逆,记为d,则d[g^i%m]=i。

还有一个数p,p满足g^p%m=n。

 

16. 如果n是m的二次剩余,则s(a)=1,如果n不是m的二次剩余,则s(a)=-1。

证明:我们将a视为原排列,d视为打乱排列,记e[i]=d[a[b[i]]],则s(e)=s(a)。下面我们来看看e是什么:

一层一层来,先记c[i]=a[b[i]]=a[g^i%m]=a[g^(i+p-p)%mo]=a[g^(i-p)*n%mo]=g^(i-p)%m。那么e[i]=d[c[i]]=d[g^(i-p)%m]=i-p。

注意,当i-p为0或负数的时候,因为费马小定理有g^(m-1)%m=1,所以i-p等价于(i-p+m-2)%(m-1)+1。

所以e[i]= (i-p+m-2)%(m-1)+1。该式子等价于,把自然排列向左循环位移p位。因为m-1为偶数,所以任意循环一次,逆序对个数奇偶性改变,循环位移p次将改变p次。如果p位奇数,则s(e)=-1,而n=g^p%m,所以n不是m的二次剩余。如果p位偶数,则s(e)=1,而n=g^p%m,n是m的二次剩余。

举例:

n=5,m=7,a=[3,6,2,5,1,4],b=[3,2,6,4,5,1],c=[2,6,4,5,1,3],d=[6,2,1,4,5,3],e=[2,3,4,5,6,1]。

e的逆序对个数为5,为奇数,所以5不是7的二次剩余。

 

记勒让德符号(n/m)为:1,n是m的二次剩余;-1,n不是m的二次剩余。

设u(X)为把表格X按一行一行排开,形成1-n*m的排列,的逆序对个数的奇偶性。

设v(X)为把表格X按一列一列排开,形成1-n*m的排列,的逆序对个数的奇偶性。

 

17.将1~n*m一行一行放置(即上述表格1)记为A;把A一列一列捡起来再将数字从左上角开始向右下方向放置(即上述表格3)记为B;则u(A)=1,因为就是自然排列,逆序对个数为零,(-1)^0=1;u(B)=(n/m)。因为u(B)=u(B的第一行)。

18.将1~n*m一列一列放置(即上述表格2)记为C;把C一行一行捡起来再将数字从左上角开始向右下方向放置(即下述表格4)记为D。则v(D)= (m/n)。考虑把表格转置一下,v和s就等价了。

 

1

8

15

17

24

26

33

4

6

13

20

22

29

31

2

9

11

18

25

27

34

5

7

14

16

23

30

32

3

10

12

19

21

28

35

综上:我们设定一下4个操作:

对于数字1-n*m,我们把数字逐个横着放置,竖着收起来,这样构成的排列记为操作w1;把数字竖着放横着收起来,记为w2;斜着放,横着收,记为w3;斜着放,竖着收记为w4;记wiwj表示先做i操作再做j操作。

那么(n/m)=s(w1w3);(m/n)=s(w2w4);(n/m)(m/n)=s(w1)*s(w2)*s(w3)*s(w4), 由于w1与w2互逆,w4等价于先w3再w1。所以原式等于s(w1)^3*s(w3)^2=s(w1)=u(C)= (-1)^[(n-1)*(m-1)/4]。

      

因此(n/m)(m/n)= (-1)^[(n-1)*(m-1)/4]

这个思路非本人所想,是刷视频刷到的,但是很多的结论视频采用“你们就认为它是对的”。我对这个证明非常感兴趣,因此把整个证明的来龙去脉全部理清楚了。

本文章的证明语言上不算特别严谨,大多采用比较浅显的语言,但是正确性绝对都是对的,是能够找到严谨证明的。我是觉得居然能用排列逆序对来证明出一个非常美妙的数论等式,不可思议,便花了一周时间从头到尾理清楚整个的逻辑,写下这篇文章。

特别鸣谢,中山市中山纪念中学,邓启龙老师,有一步给与了我很大的灵感。

 

 

 

 

posted @ 2024-03-07 18:28  西行寺東  阅读(266)  评论(0编辑  收藏  举报