.·.·. 发表于 2018-6-20 06:30:44

这道题大约没答案

我们已知一系列的正整数$n_i,m_i$(i=1,2,...,k)
对集合$J\subset\{1,2,...,k\}$
记$n_J$为,满足对$J$中任意元素$i$,$n_J$除以$m_i$的余数为$n_i$的最小的正整数
再记$f(J)=\frac{n_J}{\prod_{i\in J}m_i}$
问有没有一个能够快速求出J使得f(J)最小的算法呢?


感觉不像有的样子
不过这个题目有一点好玩的地方在于,如果只是给定$m_i$,而$n_i$都是随机选取的,那么我们能否求出f(J)最小值的期望呢?
或者,如果我们能够构造一系列$J_s$使得$f(J_s)$达到最小,那么,我们能构造出来的f(J)究竟有多小呢?

一个栗子,
n1=3,n2=4,n3=5,m1=7,m2=9,m3=11
这时候J至多有7种取值,而显然J={1}的时候,我们得到的f(J)=3/7达到最小

而对
n1=1,n2=1,n3=1,m1=7,m2=9,m3=11
这时候J至多有7种取值,而显然J={1,2,3}的时候,我们得到的f(J)=1/693达到最小



.·.·. 发表于 2018-6-21 06:17:35

好像应该补充一个估计的
对于这一点:
如果只是给定$m_i$,而$n_i$都是随机选取的,那么我们能否求出$f(J)$最小值的期望呢?
刚刚给出了一个很宽的上下界
首先,注意到每一个$n_i$都是随机选取的,我们可以近似认为$\frac{n_i}{m_i}$服从均匀分布,于是期望的上界一定会小于等于均匀分布的最小的次序统计量的期望,也就是$E Min_J f(J)<\frac 1 {k+1}$
下界,注意到一共$2^k$种组合,假定各个组合之间彼此独立的话,我们应该可以找到$2^k$个均匀分布,从而$E Min_J f(J)<\frac 1 {2^k+1}$

估计有点粗……在想有没有什么更精确的估计

补充内容 (2018-6-24 19:22):
下界的那个不等号是大于……当时写错了。
以及,玩了玩这个,忽然感觉剩余系好有意思……虽然不是随机数但真的跟随机数一样跳得厉害

hujunhua 发表于 2018-6-27 20:14:18

转述一下,不知道我理解的对不对。就是

给定一个同余方程集
         \(x\equiv n_i\pmod{m_i}\cdots\cdots(i)\)
            \(i\in I=\{1,2,\cdots,k\}\)
取其中的若干个元素构成的方程组
         \(x\equiv n_i\pmod{m_i}\cdots\cdots(i)\)
            \(i\in J\subset{I}\)
的最小正解`n_J`和模组积`m_J`(`=\D\prod_{i\in{J}}{m_i}`), 定义
            \(f(J)=\frac{n_J}{m_J}\)
要求编程计算怎样选择`J`可得到最小的`f(J)`.

.·.·. 发表于 2018-6-27 23:00:22

本帖最后由 .·.·. 于 2018-6-28 03:13 编辑

hujunhua 发表于 2018-6-27 20:14
转述一下,不知道我理解的对不对。就是

给定一个同余方程集

是的,以及
问题甚至可以简化成
每一个m_i都是某一个质数的整数次幂
反正中国剩余定理就是干这个活儿的……
以及,暂时的发现是,最终结果(在随机意义下)可能远比我之前想象得要小。
借助R,python以及pari/gp,简单实验了一下
python写的pari/gp的代码生成程序(为了防止排版问题我把空格替换成了!&^%!,只要替换回去就可以送python3执行了):
str="searched(a,b,c,d,e,f)=vecmin(["
modlist=
for!&^%!i!&^%!in!&^%!range(1,64):
!&^%!!&^%!if!&^%!bin(i).count('1')==1:
!&^%!!&^%!!&^%!!&^%!!&^%!j=len(bin(i))-bin(i).index('1')-1
!&^%!!&^%!!&^%!!&^%!!&^%!str+="lift(%c)/%d,"%(j+97,modlist)
!&^%!!&^%!!&^%!!&^%!!&^%!print()
!&^%!!&^%!else:
!&^%!!&^%!!&^%!g=];g.reverse()
!&^%!!&^%!!&^%!s="lift(chinese(["
!&^%!!&^%!!&^%!mul=1
!&^%!!&^%!!&^%!for!&^%!j,k!&^%!in!&^%!enumerate(g):
!&^%!!&^%!!&^%!!&^%!if!&^%!k=='1':
!&^%!!&^%!!&^%!!&^%!!&^%!s+="%c,"%(j+97)
!&^%!!&^%!!&^%!!&^%!!&^%!mul*=modlist
!&^%!!&^%!!&^%!str+=s[:-1]+"]))/%d,"%mul

print(str[:-1]+"])")
这是机器生成的难看的gp代码:

searched(a,b,c,d,e,f)=vecmin())/15,lift(c)/7,lift(chinese())/21,lift(chinese())/35,lift(chinese())/105,lift(d)/11,lift(chinese())/33,lift(chinese())/55,lift(chinese())/165,lift(chinese())/77,lift(chinese())/231,lift(chinese())/385,lift(chinese())/1155,lift(e)/13,lift(chinese())/39,lift(chinese())/65,lift(chinese())/195,lift(chinese())/91,lift(chinese())/273,lift(chinese())/455,lift(chinese())/1365,lift(chinese())/143,lift(chinese())/429,lift(chinese())/715,lift(chinese())/2145,lift(chinese())/1001,lift(chinese())/3003,lift(chinese())/5005,lift(chinese())/15015,lift(f)/17,lift(chinese())/51,lift(chinese())/85,lift(chinese())/255,lift(chinese())/119,lift(chinese())/357,lift(chinese())/595,lift(chinese())/1785,lift(chinese())/187,lift(chinese())/561,lift(chinese())/935,lift(chinese())/2805,lift(chinese())/1309,lift(chinese())/3927,lift(chinese())/6545,lift(chinese())/19635,lift(chinese())/221,lift(chinese())/663,lift(chinese())/1105,lift(chinese())/3315,lift(chinese())/1547,lift(chinese())/4641,lift(chinese())/7735,lift(chinese())/23205,lift(chinese())/2431,lift(chinese())/7293,lift(chinese())/12155,lift(chinese())/36465,lift(chinese())/17017,lift(chinese())/51051,lift(chinese())/85085,lift(chinese())/255255])
c=0;for(i3=1,2,for(i5=1,4,for(i7=1,6,for(i11=1,10,for(i13=1,12,for(i17=1,16,c++))))));c
a=Col(0,92160);
cc=0;for(i3=1,2,for(i5=1,4,for(i7=1,6,for(i11=1,10,for(i13=1,12,for(i17=1,16,cc++;a=(searched(Mod(i3,3),Mod(i5,5),Mod(i7,7),Mod(i11,11),Mod(i13,13),Mod(i17,17)))))))))
a
\w /mnt/b/output.txt
这里是R的绘图部分结果
vec=source("B:\\output.txt")#这里更改了output使得其符合R的语法,然而仍然读了15秒……
runif_count=48;len=length(vec);g=apply(matrix(runif(len*runif_count),len),1,min);plot(sort(vec),sort(g),type='l',main="g=apply(matrix(runif(len*runif_count=48),len),1,min)");abline(0,1,col=2)
对6个质数(3,5,7,11,13,17)的测试结果表明,我们的目标值大约跟$U_(48,1)$的分布差不多,这里$U_(j,i)$代表的是,$j$个服从均匀分布$U(0,1)$的随机变量之中第$i$小的随机变量
当然这里只是头部如此,尾巴上面会有偏差,毕竟我们选择的都是小质数,如果质数大一些,或许这个出现在尾部的偏差理应会减小……
所以感觉是,最优值就在那里,但我们就是找不到……




.·.·. 发表于 2018-6-28 15:32:39

这是用了两个小时才读到R里面的数据
用的质数是5,7,11,13,17,19,可以看出如果质数足够大,分布或许真的会接近估计出来的那个下界……
所以问题只是,最小值在哪里取到



.·.·. 发表于 2018-6-29 03:36:54

小发现
可以借助CRT复原一个大数N,使得$N=n_i mod m_i$
之后连分数计算$\frac N{\prod_i m_i}$
如果我们得到的连分数之中,某一个渐进分数的分母恰好可以被$m_i$因子分解掉,那么去掉这些$m_i$,选取剩下的那些$m_i$,那么我们有一定概率得到一个相当小的结果。
页: [1]
查看完整版本: 这道题大约没答案