数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: ysr

求助由点坐标求函数表达式

[复制链接]
 楼主| 发表于 2020-5-20 18:04 | 显示全部楼层
谢谢老师!
1000000000000内的素数个数下限为 37476779131,实际10^12内的素数个数为37607912018,
还是下限,与实际有差距,所以前面的公式还需要进一步调整。
因为公式结果低于实际值,以下为实际点值(未去掉提前量的值):
(12,39141.0110953409),
(13,113518.448309902),
(14,331507.539035292),
(15,973817.648194232),
(16,2875202.63313653),
(17,8526702.130569),
(18,25385294.9975121),
(19,75836542.1953732),
(20,227252218.171467),
(21,682863854.846566),
(22,2057025628.49085),
(23,6210469059.53879),
(24,18788892908.8663),
(25,56950057419.9396),
不用从数学规律上推导公式,用数据说话,直接由数值点得到函数公式,居然很方便。

去掉提前量就是上面的值再加上4,如前面的第一个点变成了(12,39145.0110953409)。

用这些点能弄出来更准确的公式吗?我要的就是经验公式,不是要啥理论工具,要的准确的公式,起码在需要的数据段要非常准确,非常接近实际,以便方便的找到需要的素数。素数个数的绝对下限公式专家已经证明了,不需要另外搞个下限公式。

其实理论公式是这样的2*x^(1/2)+4*x^(1/4)+8*x^(1/8)+……,有几项也不知道,反正最后一项变为1或0为止了,这个怎么推?这就是前面的公式的理论依据,但太复杂没法推导,所以用数值法简单明了,不需要明白它是啥函数,只要结果准确就行,不需要管是否是在无穷大仍然成立,只要在我们需要的数据段准确就行了,这个已经是很不容易了,因为我们需要的是很大的素数。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-5-22 00:45 | 显示全部楼层
谢谢老师,非常感谢!
1000000000000内的素数个数下限为 37379740471,实际为37607912018,
10000000000000内的素数个数下限为 337538569552,实际为346065536839,
100000000000000内的素数个数下限为 3112275177784,实际为3204941750802,
1000000000000000内的素数个数下限为 28982978026665,实际为29844570422669,
10000000000000000内的素数个数下限为 271523012960059,实际为279238341033925,
100000000000000000内的素数个数下限为 2.55493817243098E+15,实际为2623557157654233,
1000000000000000000内的素数个数下限为 2.41282618765196E+16,实际为24739954287740860,
10000000000000000000内的素数个数下限为 2.28578411731636E+17,实际为234057667276344607,
100000000000000000000内的素数个数下限为 2.17147952514046E+18,实际为2220819602560918840,
1000000000000000000000内的素数个数下限为 2.06807110443267E+19,实际为21127269486018731928,
10000000000000000000000内的素数个数下限为 1.97406647369896E+20,实际为201467286689315906290,
100000000000000000000000内的素数个数下限为 1.88823707350289E+21,实际为1925320391606803968923,
1000000000000000000000000内的素数个数下限为 1.80956040055934E+22,实际为18435599767349200867866,
这是根据理论依据,调整公式后的验证结果。下面发一下这个程序:
Private Sub Command1_Click()
Dim a, b, c
a = Trim(Text1)
b = Sqr(a)
c = a / Log(a)
If a > 10 ^ 11 Then
s = 1
Do While Int(b ^ (2 ^ (1 - s))) > 1
b6 = b ^ (2 ^ (1 - s))
b7 = 2 ^ (s + 14) * b6 + b7
Print b7
s = s + 1
Loop
c = (a + b7) / Log(a)
ElseIf a > 10000000 Then
a1 = Log(a) / Log(10)
b2 = Exp(1.033 * a1)
b1 = 0.159 * b2
b4 = (1.74136140824861 ^ (1.8 * a1)) / 4.9
b5 = (b1 + b4) / 2
c = (a + (b5 + 4) * b) / Log(a)
ElseIf a >= 10000 Then
a1 = Log(a) / Log(10)
b3 = (56 * a1 ^ 3 - 741 * a1 ^ 2 + 3367 * a1 - 5142) / 6
c = (a + (b3 + 4) * b) / Log(a)
ElseIf a >= 1000 Then
c = (a + 4 * b) / Log(a)
ElseIf a > 500 Then
c = (a + 2 * b) / Log(a)
Else
c = c
End If
d = a / c
d1 = Int(c) * d
c1 = a & "内的素数个数下限为 " & Int(c)
Text2 = c1
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""
End Sub
采用分段调整,每一段的公式或数据只管本数段,下一段则用另一个外的不同数据或公式,不用管到无穷,直到我们能用到的大整数数段为止,不用管无穷大是否还成立。仅为了使用,用到的都算是经验公式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 23:49 | 显示全部楼层
用唯一的公式来表示非常接近实际甚至等于实际的方法是可能的,公式会复杂,但是有可能实现,用到知识点也不会太高。

目前还是分段调整一下,这样容易实现,而且只做微弱的调整结果就会有巨大变化,没有大数据的实际值是不行的,大数据又必须有快速乘法除法程序来获得,所以,这个技术是重要的,希望老师有空看看,给予指导帮助!

主要想解决的问题是两个,一个是前面的准确素数个数公式(这个解决了,大素数也可以准确的计算得到),另一个就是快速乘法除法程序,这两个互相关联(虽然理论上不关联),缺一个不行,就无法研究下去了。目前我只能调整到10^25内,再大的没有实际值参考了,只能是理论估计值,是个下限值,再调整就不明白不确定是否是下限了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-31 11:43 | 显示全部楼层
下面的结果就是上面的公式结合快速判断大素数的程序得到的:
99999999999971和99999999999973是一对14位的孪生素数。
99999999999973是10^14内的最大素数了。
1000000000000000内的素数个数下限为 29641490792455,其内最大的素数约为999999999999967(其实是合数),实际是999999999999989,这个是素数,是10^15内的最大素数。
10^16以上就成了科学记数法,不准确了,要改进程序换大整数计数程序。
10000000000000000内的素数个数下限为 277084362658475,
其内的最大素数约9.99999999999996E+15,实际10^16内的最大素数是9999999999999937
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2020-6-4 01:09 , Processed in 0.093750 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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