找回密码
 快速注册
搜索
查看: 57|回复: 11

用MMA分集合为两个非空部分

[复制链接]

471

主题

945

回帖

9837

积分

积分
9837

显示全部楼层

青青子衿 发表于 2023-7-28 07:50 |阅读模式
  1. array = {1, 2, 4, 7, 16};
  2. n = Length[array];
  3. {Pick[array, IntegerDigits[#, 2, n], 1],
  4.    Pick[array, IntegerDigits[#, 2, n], 0]
  5.    } & /@ Range[2^(n - 1), 2^n - 2]
复制代码

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-3-10 00:21
刚才 @睡神 问我一个问题:
将若干个数分成两组,然后算这两组数的乘积的差,研究它们的最小值,能用编程算吗
比如 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31
最近无聊,就找连续的素数无目的的计算,算了几个,发现最小值要么为1,要么为素数

(这里的差应该是指绝对值的吧)
我一时没有好想法,就在这版块逛一下,O(∩_∩)O哈!还真发现了本帖,恰好适用,谢谢 86鱼 了😊

不过我得先理解一下这段代码的意思:
将一组数分成两组,就是在原数组中任取出若干个组成一组,剩下的为另一组。
将原数组排成固定的一列后,取的就标记为 1,不取的标记为 0,那任意一种取法就对应一个二进制数。
比如 {a,b,c,d,e} 分成 {a,c} 和 {b,d,e} 时就对应 10100。
又这里两个组是不分次序的,即 10100 与 01011 是同一分法,所以不妨规定必取第一个,于是所有分组法就是 10000, 10001, ..., 11110,即 `2^4` ~ `2^5-2`,这便是 1# 最后一行 Range[2^(n - 1), 2^n - 2] 的来由。
至于前面的 Pick 和 IntegerDigits:
前者就是选取元素,用 Pick[{a, b, c, d, e}, {1, 0, 1, 0, 0}, 1] 就得到 {a, c},详见:reference.wolfram.com/language/ref/Pick.html
后者就是将数写成进制列表,如 IntegerDigits[16, 2] 得 {1, 0, 0, 0, 0},第三个参数是规定位数(不足时用零补全前面)(其实这里 Range[2^(n - 1), 2^n - 2] 一定是 n 位,不需要补)

代码理解完,那就可以用来解决那问题:
  1. array = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
  2. n = Length[array];
  3. lst = Abs[
  4.      Times @@ Pick[array, IntegerDigits[#, 2, n], 1] -
  5.       Times @@ Pick[array, IntegerDigits[#, 2, n], 0]] & /@
  6.    Range[2^(n - 1), 2^n - 2];
  7. Min[lst]
  8. % == 1 || PrimeQ[%]
复制代码

输出是 1579 和 True。

9

主题

348

回帖

2806

积分

积分
2806

显示全部楼层

睡神 发表于 2024-3-10 00:39
kuing 发表于 2024-3-10 00:21
刚才 @睡神 问我一个问题:

(这里的差应该是指绝对值的吧)

嗯,是绝对值。
我通过估算,再调整逼近,也算出1579,但不确定还有没有更小的。
回到那个问题,最小值(为1时,取次小值)是否都是素数?

点评

2×5×7×13×17×29-3×11×19×23×31=1,579  发表于 2024-3-10 00:56
除了不懂,就是装懂

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-3-10 00:41
  1. array = Table[Prime[k], {k, 13}]
  2. n = Length[array];
  3. lst = Abs[
  4.      Times @@ Pick[array, IntegerDigits[#, 2, n], 1] -
  5.       Times @@ Pick[array, IntegerDigits[#, 2, n], 0]] & /@
  6.    Range[2^(n - 1), 2^n - 2];
  7. Min[lst]
  8. % == 1 || PrimeQ[%]
复制代码

输出:
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}
95533
False
就是说当连续素数到 41,最小值就不是素数了,很可惜呀,猜想不成立。

9

主题

348

回帖

2806

积分

积分
2806

显示全部楼层

睡神 发表于 2024-3-10 00:47
本帖最后由 睡神 于 2024-3-10 00:54 编辑
kuing 发表于 2024-3-10 00:41
输出:
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41}
95533


我只算到31,并且23、29、31都是估算的,后面的数据量太多太大了,估算也不容易
除了不懂,就是装懂

730

主题

1万

回帖

9万

积分

积分
93593
QQ

显示全部楼层

kuing 发表于 2024-3-10 01:57
{素数个数,素数列表,最小值,是否素数或1}:

{3,{2,3,5},1,True}

{4,{2,3,5,7},1,True}

{5,{2,3,5,7,11},13,True}

{6,{2,3,5,...,13},17,True}

{7,{2,3,5,...,17},1,True}

{8,{2,3,5,...,19},41,True}

{9,{2,3,5,...,23},157,True}

{10,{2,3,5,...,29},1811,True}

{11,{2,3,5,...,31},1579,True}

{12,{2,3,5,...,37},18859,True}

{13,{2,3,5,...,41},95533,False}

{14,{2,3,5,...,43},17659,True}

{15,{2,3,5,...,47},1995293,True}

{16,{2,3,5,...,53},208303,False}

{17,{2,3,5,...,59},2396687,True}

{18,{2,3,5,...,61},58513111,False}

{19,{2,3,5,...,67},299808329,False}

{20,{2,3,5,...,71},2460653813,False}

{21,{2,3,5,...,73},3952306763,True}

{22,{2,3,5,...,79},341777053,True}

{23,{2,3,5,...,83},115405393057,False}

{24,{2,3,5,...,89},437621467859,False}

{25,{2,3,5,...,97},1009861675153,False}

{26,{2,3,5,...,101},6660853109087,False}

点评

第一次有部分数据出错,是因为溢出导致的吗?  发表于 2024-3-10 09:06
?哪里出错?  发表于 2024-3-10 13:54
昨晚你说37打后连续出现6个合数  发表于 2024-3-10 16:33
我没这样说,我当时是试到 18 19 20 那三个连续 False 之后以为后面也一样,结果 21 22 又给我来了两个 True  发表于 2024-3-10 16:54
噢,不好意思,是我理解错了  发表于 2024-3-10 17:30

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:12

Powered by Discuz!

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