找回密码
 欢迎注册
楼主: jjnet

[悬赏] 这样的十进数有多少个?(排列问题)

[复制链接]
发表于 2017-3-30 13:10:09 | 显示全部楼层
题目中还有一点比较有意思的结果,可以看到虽然题目中矩阵是7阶的,但是这个数列却是一个5阶线性递推数列,
于是可以猜测其中应该还有一些隐含的约束在里面。
如果我们把3#中每个模式反序观之,可以看出4和7是镜像偶,相应的计数函数可以互相代换,省掉一个,其它5个模式是镜像自对称的,计数函数也各不相等。
于是对应的矩阵刚好可以降低到6阶,7用4代换后的矩阵如下:
$M_2=[(6,0,0,7,0,7),(0,0,0,0,1,0),(0,0,0,1,0,0),(0,0,8,0,7,0),(1,0,0,0,0,1),(0,8,0,7,0,0)]$
经计算不出所料$M$和$M_2$的最小多项式都是$x^5−7x^4−x^3−57x^2+64=(x-8)(x-1)(x+1)(x^2+x+8)$,但是出乎意料的是$M_2$的特征多项式不是$M$的特征多项式的因子
其中$M$的特征多项式是$(x-8)(x-1)(x+1)(x^2+x+8)^2$,而$M_2$的特征多项式是$(x-8)(x-1)(x+1)^2(x^2+x+8)$

ps: 最出人意料的是只有1对计数相等的模式,而不是两对从而降为5阶矩阵。

另外一般情况,我们把10个数改为T个数,那么递推数列的特征多项式就是$(x-T+2)(x-1)(x+1)(x^2+x+T-2)$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-3-30 15:31:22 | 显示全部楼层
终于理解了到矩阵计算这一步, 但是下面一句
'经计算可以知道p(n)的特征多项式为"   不懂, 特征多项式跟递推公式和矩阵结果存在什么关系? 是线性代数的书有讲吗?

点评

直接选择矩阵的最小多项式即可(当然也必然是矩阵特征多项式的因式)  发表于 2017-3-30 16:28
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-3-30 16:13:59 | 显示全部楼层
另外, 这个递推公式能转换成通项公式吗?

点评

通常待定系数法即可,特征多项式有五个不同的复数根$r_1,r_2,r_3,r_4,r_5$,于是设各项为$a_1r_1^n+a_2r_2^n+a_3r_3^n+a_4r_4^n+a_5r_5^n$将$n=3,4,5,6,7$代入就可以求出系数$a_i$  发表于 2017-3-30 16:27
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-31 09:07:39 | 显示全部楼层
比如数值表示可以用Pari/Gp如下计算:
? b=[1,0,0,0,0,1]
%1 = [1, 0, 0, 0, 0, 1]
? v=[0,0,0,0,0,720]~
%2 = [0, 0, 0, 0, 0, 720]~
? m=[6,0,0,7,0,7;0,0,0,0,1,0;0,0,0,1,0,0;0,0,8,0,7,0;1,0,0,0,0,1;0,8,0,7,0,0]
%3 =
[6 0 0 7 0 7]

[0 0 0 0 1 0]

[0 0 0 1 0 0]

[0 0 8 0 7 0]

[1 0 0 0 0 1]

[0 8 0 7 0 0]

? mateigen(m)
%4 =
[-2 0 7 -0.73224568138195777351247600767754318618 + 0.63585792627329425022285708692064049226*I -0.73224568138195777351247600767754318618 - 0.63585792627329425022285708692064049226*I]

[-1 1 1/8 -0.0037188099808061420345489443378119001906 - 0.086161420681990502393643449803322083513*I -0.0037188099808061420345489443378119001906 + 0.086161420681990502393643449803322083513*I]

[-1 -1 1/8 0.10832533589251439539347408829174664107 - 0.0046754259284801047810504197567694153845*I 0.10832533589251439539347408829174664107 + 0.0046754259284801047810504197567694153845*I]

[1 -1 1 -0.067178502879078694817658349328214971211 - 0.29922725942272670598722686443324258459*I -0.067178502879078694817658349328214971211 + 0.29922725942272670598722686443324258459*I]

[1 1 1 -0.23800383877159309021113243761996161228 + 0.053433439182629768926290511505936175822*I -0.23800383877159309021113243761996161228 - 0.053433439182629768926290511505936175822*I]

[1 1 1 1 1]

? P=%4;
? P^-1*m*P
%6 =
[-1.0000000000000000000000000000000000000 + 0.E-37*I -1.4693679385278593850 E-39 + 0.E-37*I -3.673419846319648463 E-38 + 0.E-38*I 1.4693679385278593850 E-39 + 8.265194654219209041 E-40*I -7.346839692639296925 E-39 - 2.3877229001077715006 E-39*I]

[-5.142787784847507848 E-39 + 0.E-37*I 1.0000000000000000000000000000000000000 + 0.E-37*I -6.538687326448974264 E-38 - 3.159141067834897678 E-38*I 2.5713938924237539236 E-39 + 7.255004196481305714 E-39*I 9.550891600431086002 E-39 - 7.255004196481305714 E-39*I]

[-8.816207631167156310 E-39 + 4.353682780823287065 E-40*I -8.816207631167156310 E-39 + 1.0884206952058217666 E-39*I 7.9999999999999999999999999999999999999 - 9.360417978770067193 E-39*I -2.938735877055718770 E-39 + 7.074734518837841484 E-40*I 0.E-38 - 1.8639204405399697752 E-39*I]

[2.938735877055718770 E-39 - 1.7632415262334312620 E-38*I 1.4693679385278593850 E-38 - 1.7632415262334312620 E-38*I 2.938735877055718770 E-39 - 1.7632415262334312620 E-38*I -0.50000000000000000000000000000000000002 - 2.7838821814150109610597356494592747602*I -2.350988701644575016 E-38 - 2.938735877055718770 E-38*I]

[-1.7632415262334312620 E-38 + 5.289724578700293786 E-38*I 1.7632415262334312620 E-38 + 5.289724578700293786 E-38*I 5.877471754111437540 E-39 + 5.289724578700293786 E-38*I -1.4693679385278593850 E-38 - 5.877471754111437540 E-39*I -0.50000000000000000000000000000000000000 + 2.7838821814150109610597356494592747603*I]

? P^-1*v
%7 = [34.999999999999999999999999999999999999 + 1.0579449157400587572 E-36*I, 35.999999999999999999999999999999999998 - 1.0579449157400587572 E-36*I, 64.000000000000000000000000000000000000 + 3.134651602192766688 E-37*I, 292.50000000000000000000000000000000000 - 39.602969096903865607333658755210973202*I, 292.50000000000000000000000000000000000 + 39.602969096903865607333658755210973202*I]~
? b*P
%8 = [-1, 1, 8, 0.26775431861804222648752399232245681382 + 0.63585792627329425022285708692064049226*I, 0.26775431861804222648752399232245681382 - 0.63585792627329425022285708692064049226*I]
?
由此可以看出,由于数列通项为$b*M^{n-3}*v' = b*P*(P^{-1}MP)^{n-3}*P^{-1}v'$
其中$b*P=[-1, 1, 8, 0.26775431861804222648752399232245681382 + 0.63585792627329425022285708692064049226*I, 0.26775431861804222648752399232245681382 - 0.63585792627329425022285708692064049226*I]$
$P^{-1}v'= [34.999999999999999999999999999999999999 + 1.0579449157400587572 E-36*I, 35.999999999999999999999999999999999998 - 1.0579449157400587572 E-36*I, 64.000000000000000000000000000000000000 + 3.134651602192766688 E-37*I, 292.50000000000000000000000000000000000 - 39.602969096903865607333658755210973202*I, 292.50000000000000000000000000000000000 + 39.602969096903865607333658755210973202*I]~$
而$P^{-1}MP$是对角阵$diag{-1,1,8, -0.5-2.7838821814150109610597356494592747602*I,-0.5+2.7838821814150109610597356494592747602*I}$
表示$a(n)=-35*(-1)^(n-3)+36+512*8^(n-3)+(103.5+175.38457742914569054676334591593430989i)*(-0.5-2.7838821814150109610597356494592747602i)^(n-3)+(103.5-175.38457742914569054676334591593430989i)*(-0.5+2.7838821814150109610597356494592747602i)^(n-3)$
只是很奇怪,这里P不是方阵,Pari-gp是如何算出$P^{-1}$的而且最后通项好像也没有错
如果我们设$r_1,r_2$分别是方程$x^2+x+8=0$的根,那么通解应该是
$a(n)=-35*(-1)^{n-3}+36+512*8^{n-3}+(135+63*r_2)r_1^{n-3}+(135+63*r_1)r_2^{n-3}$
上面表达式还可以写成
$a(n)=36-35*(-1)^{n-3}+512*8^{n-3}+135*(r_1^{n-3}+r_2^{n-3})+504*(r_1^{n-4}+r_2^{n-4})=36-35*(-1)^{n-3}+512*8^{n-3}+135b(n-3)+504b(n-4)$
其中$b(n)$是二阶递推数列$b(0)=2,b(1)=-1,b(n+2)=-b(n+1)-8b(n)$
或者
$a(n)=36+35*(-1)^n+8^n+270*\sqrt{8}^{n-3}*cos((n-3)(\pi-arctan(\sqrt{31})))+1008*\sqrt{8}^{n-4}*cos((n-4)(\pi-arctan(\sqrt{31})))$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-3-31 20:14:47 来自手机 | 显示全部楼层
楼上计算过程说明准确计算过程需要将矩阵转化为Jordan标准型,但是pari/gp好像没有对应的函数。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-1 12:37:48 | 显示全部楼层
mathe 发表于 2017-3-30 12:48
题目中的进一步要求把片断长度改为k会导致计算过程快速复杂化。
比如题目中k从3变化到4,可以有34种不同的模式,也就是题目需要处理一个34阶矩阵了.


k=4时,34种模式中,有10个镜像对称偶,剩余14个为镜像自对称。故递推矩阵可降为24阶。

手工排的,不知道有没有错误。如果没有错误的话,猜想k=5时,或许递推矩阵阶数可降为5!

点评

k=5状态应该继续增加吧?当然只有10个数字,如果k继续增加,状态就减少了。但是如果不限制数字数目,状态还会继续增加  发表于 2017-4-1 15:51
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-1 16:42:10 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #define K 4
  5. #define NUM ((K)-1)
  6. #define MASK_FOR_LAST_N_BITS(n)   ((1<<(n))-1)
  7. #define MASK_FOR_BEFORE_N_BITS(n) (~MASK_FOR_LAST_N_BITS(n))
  8. #define IS_BIT_SET(x, b)   (((x)&(1<<(b)))!=0)

  9. int match_count;
  10. int total_count;
  11. void output(char map[NUM])
  12. {
  13.     int unused=NUM;
  14.     int i;
  15.     char map2[NUM];
  16.     int unmatched_found=0;
  17.     memset(map2,-1,sizeof(map2));
  18.     for(i=0;i<NUM;i++){
  19.         printf("%c", i+'A');
  20.     }
  21.     printf("  ==>  ");
  22.     for(i=0;i<NUM;i++){
  23.         if(map[i]!=-1){
  24.             map2[map[i]]=NUM-1-i;
  25.             printf("%c", map[i]+'A');
  26.         }else{
  27.             printf("%c", unused++ + 'A');
  28.         }
  29.     }
  30.     printf("  R  ");
  31.     unused=NUM;
  32.     for(i=NUM-1;i>=0;i--){
  33.         if(map2[i]!=map[NUM-1-i])unmatched_found=1;
  34.         if(map2[i]!=-1){
  35.            printf("%c", map2[i]+'A');
  36.         }else{
  37.            printf("%c", unused++ + 'A');
  38.         }
  39.     }
  40.     printf("\n");
  41.     if(!unmatched_found){
  42.        match_count++;
  43.     }
  44.     total_count++;
  45. }

  46. void recursive(int old_state, int search_bit, char map[NUM])
  47. {
  48.     if((old_state&MASK_FOR_BEFORE_N_BITS(search_bit))==0){//finished search
  49.         output(map);
  50.         return;
  51.     }
  52.     while(!IS_BIT_SET(old_state, search_bit))search_bit++;
  53.     int i;
  54.     for(i=0;i<NUM;i++){
  55.         if(map[i]==-1){
  56.             map[i]=search_bit;
  57.             recursive(old_state, search_bit+1, map);
  58.             map[i]=-1;
  59.         }
  60.     }
  61. }

  62. void search(int old_state)/*bit state to show whether a old state is used*/
  63. {
  64.     char map[NUM];
  65.     memset(map, -1, sizeof(map));
  66.     recursive(old_state, 0, map);
  67. }

  68. int main()
  69. {
  70.     int i;
  71.     for(i=0; i<(1<<NUM);i++){
  72.         search(i);
  73.     }
  74.     printf("Total %d states, %d mapped to itself and total %d states after removing duplicated\n", total_count, match_count, match_count+(total_count-match_count)/2);
  75.     return 0;
  76. }
复制代码

output:
ABC  ==>  DEF  R  DEF
ABC  ==>  ADE  R  DEC
ABC  ==>  DAE  R  DEB
ABC  ==>  DEA  R  DEA
ABC  ==>  BDE  R  DCE
ABC  ==>  DBE  R  DBE
ABC  ==>  DEB  R  DAE
ABC  ==>  ABD  R  DBC
ABC  ==>  ADB  R  DAC
ABC  ==>  BAD  R  DCB
ABC  ==>  DAB  R  DAB
ABC  ==>  BDA  R  DCA
ABC  ==>  DBA  R  DBA
ABC  ==>  CDE  R  CDE
ABC  ==>  DCE  R  BDE
ABC  ==>  DEC  R  ADE
ABC  ==>  ACD  R  BDC
ABC  ==>  ADC  R  ADC
ABC  ==>  CAD  R  CDB
ABC  ==>  DAC  R  ADB
ABC  ==>  CDA  R  CDA
ABC  ==>  DCA  R  BDA
ABC  ==>  BCD  R  BCD
ABC  ==>  BDC  R  ACD
ABC  ==>  CBD  R  CBD
ABC  ==>  DBC  R  ABD
ABC  ==>  CDB  R  CAD
ABC  ==>  DCB  R  BAD
ABC  ==>  ABC  R  ABC
ABC  ==>  ACB  R  BAC
ABC  ==>  BAC  R  ACB
ABC  ==>  CAB  R  CAB
ABC  ==>  BCA  R  BCA
ABC  ==>  CBA  R  CBA
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-1 16:44:00 | 显示全部楼层
K=5的状态算出来了,共209,去除对称性还有126个状态,当然最终递推数列的阶应该会更低一些
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-1 21:04:33 | 显示全部楼层
稍微修改上面代码,可以将两个矩阵输出成gp格式,然后用gp求两矩阵特征多项式并且求它们公因子
可以得到K=4时,数列特征多项式为14次(暗示最终结果等于自对称的数目?)多项式$(x-7)(x+1)^2(x^2-x+1)(x^3-x^2+x-7)(x^3+x^2-x-7)(x^3+x^2+7*x+49)$
同样,如果将10个数改为T个数,特征多项式为$(x-T+3)(x+1)^2(x^2-x+1)(x^3-x^2+x-T+3)(x^3+x^2-x-T+3)(x^3+x^2+(T-3)*x+(T-3)^2)$

而对于K=5, 计算特征多项式在我的笔记本上垮了(应该是gp分配的内存不够)
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <map>
  5. #include <string>
  6. using namespace std;
  7. #define K 5
  8. #define NUM ((K)-1)
  9. #define MASK_FOR_LAST_N_BITS(n)   ((1<<(n))-1)
  10. #define MASK_FOR_BEFORE_N_BITS(n) (~MASK_FOR_LAST_N_BITS(n))
  11. #define IS_BIT_SET(x, b)   (((x)&(1<<(b)))!=0)

  12. typedef map<string, string> SMap;
  13. typedef map<string, int> IMap;
  14. SMap string_map;
  15. IMap imap1, imap2;
  16. int ic1,ic2;
  17. void decode_string(const string& s, int& present, int& last_used)
  18. {
  19.     present = 0;
  20.     last_used=0;
  21.     int i;
  22.     for(i=0;i<NUM;i++){
  23.        int d=s[i]-'A';
  24.        if(d>=NUM)last_used=d-NUM+1;
  25.        else present |= 1<<d;
  26.     }
  27. }

  28. string shift_string(const string& s, char& new_char)
  29. {
  30.     char c=s[0];
  31.     int first_new=0;
  32.     if(c-'A'>=NUM){
  33.         first_new=1;
  34.     }
  35.     int i;
  36.     string out;
  37.     for(i=1;i<NUM;i++){
  38.         c=s[i];
  39.         if(c-'A'>=NUM){
  40.             c-=first_new;
  41.         }
  42.         out+=c;
  43.     }
  44.     if(first_new)new_char--;
  45.     return out;
  46. }

  47. void gen_sum(void)
  48. {
  49.     printf("T=10;\n");
  50.     printf("m1=matrix(%d,%d);\n",ic1,ic1);
  51.     printf("m2=matrix(%d,%d);\n",ic2,ic2);
  52.     IMap::iterator it;
  53.     for(it=imap1.begin(); it!=imap1.end();++it){
  54.         int from = it->second;
  55.         string s=it->first;
  56.         int present, last_used;
  57.         decode_string(s, present, last_used);
  58.         int i;
  59.         char new_char='A'+NUM+last_used;
  60.         string t = shift_string(s, new_char);
  61.         for(i=0;i<NUM;i++){
  62.           if(!IS_BIT_SET(present, i)){
  63.              string h=t;
  64.              h+=(char)('A'+i);
  65.              IMap::iterator it2 = imap1.find(h);
  66.              int to = it2->second;
  67.              printf("m1[%d,%d]=1;\n", to+1, from+1);
  68.           }
  69.         }
  70.         t+=new_char;
  71.         IMap::iterator it2=imap1.find(t);
  72.         int to = it2->second;
  73.         printf("m1[%d,%d]=T-%d;\n", to+1, from+1, last_used+NUM);
  74.     }
  75.     for(it=imap1.begin(); it!=imap1.end();++it){
  76.         string s = it->first;
  77.         IMap::iterator it2 = imap2.find(s);
  78.         if(it2==imap2.end()){
  79.             SMap::iterator sit = string_map.find(s);
  80.             string ns = sit->second;
  81.             it2 = imap2.find(ns);
  82.         }
  83.         int from = it2->second;
  84.         int present, last_used;
  85.         decode_string(s, present, last_used);
  86.         int i;
  87.         char new_char='A'+NUM+last_used;
  88.         string t = shift_string(s, new_char);
  89.         for(i=0;i<NUM;i++){
  90.            if(!IS_BIT_SET(present, i)){
  91.               string h=t;
  92.               h+=(char)('A'+i);
  93.               IMap::iterator it2=imap2.find(h);
  94.               if(it2 != imap2.end()){
  95.                   int to=it2->second;
  96.                   printf("m2[%d,%d]+=1;\n", to+1, from+1);
  97.               }
  98.            }
  99.         }
  100.         t+=new_char;
  101.         it2=imap2.find(t);
  102.         if(it2!=imap2.end()){
  103.             int to = it2->second;
  104.             printf("m2[%d,%d]+=T-%d;\n", to+1, from+1, last_used+NUM);
  105.         }
  106.     }
  107. }

  108. void output(char map[NUM])
  109. {
  110.     int unused=NUM;
  111.     int i;
  112.     char map2[NUM];
  113.     int unmatched_found=0;
  114.     memset(map2,-1,sizeof(map2));
  115.     string s1,s2;
  116.     for(i=0;i<NUM;i++){
  117.         if(map[i]!=-1){
  118.             map2[map[i]]=NUM-1-i;
  119.             s1+=(char)(map[i]+'A');
  120.         }else{
  121.             s1+=(char)(unused++ + 'A');
  122.         }
  123.     }
  124.     unused=NUM;
  125.     for(i=NUM-1;i>=0;i--){
  126.         if(map2[i]!=map[NUM-1-i])unmatched_found=1;
  127.         if(map2[i]!=-1){
  128.            s2+= (char)(map2[i]+'A');
  129.         }else{
  130.            s2+=(char)(unused++ + 'A');
  131.         }
  132.     }
  133.     string_map.insert(make_pair(s1,s2));
  134.     imap1.insert(make_pair(s1, ic1)); ic1++;
  135.     if(s1<=s2){
  136.        imap2.insert(make_pair(s1,ic2)); ic2++;
  137.     }
  138. }

  139. void recursive(int old_state, int search_bit, char map[NUM])
  140. {
  141.     if((old_state&MASK_FOR_BEFORE_N_BITS(search_bit))==0){//finished search
  142.         output(map);
  143.         return;
  144.     }
  145.     while(!IS_BIT_SET(old_state, search_bit))search_bit++;
  146.     int i;
  147.     for(i=0;i<NUM;i++){
  148.         if(map[i]==-1){
  149.             map[i]=search_bit;
  150.             recursive(old_state, search_bit+1, map);
  151.             map[i]=-1;
  152.         }
  153.     }
  154. }

  155. void search(int old_state)/*bit state to show whether a old state is used*/
  156. {
  157.     char map[NUM];
  158.     memset(map, -1, sizeof(map));
  159.     recursive(old_state, 0, map);
  160. }

  161. int main()
  162. {
  163.     int i;
  164.     for(i=0; i<(1<<NUM);i++){
  165.         search(i);
  166.     }
  167.     gen_sum();
  168.     return 0;
  169. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-4-1 21:53:23 来自手机 | 显示全部楼层
现在我们以K=3为例子分析为什么最终阶数等于自对称状态数目。因为AC和CB相等,除了抛弃状态CB外,利用AC和CB递推式中右边相等,我们还可以将AC表示为其它各项(不包括CB)的线性组合AC(n)=8BA(n)+7CA(n)-CD(n),于是我们还可以将递推式中所有AC(n)继续用这个线性组合替换,从而可以继续抛弃AC
利用这种方法对于K=3,我们可以得出通项公式
$a(n)=[(1,0,0,0,1)][(-1,0,56,49,7),(0,0,0,1,0),(-1,0,8,7,0),(1,0,0,0,1),(-7,8,56,49,0)]^{n-3}[(0),(0),(0),(0),(720)]$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 04:06 , Processed in 0.045525 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表