ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[分享] 正整数分解的自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-9-5 23:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:自定义函数开发
m refers to the m^th prime above or below n.

TA的精华主题

TA的得分主题

发表于 2013-9-6 08:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
香川群子 发表于 2013-9-5 11:41
一共四个关于素数的自定义函数,整合到一起了:

excel怎么使用?新手咨询:比如“153”这个数,在excel怎么运行程序,分解质因数?

TA的精华主题

TA的得分主题

发表于 2013-9-6 09:20 | 显示全部楼层
本帖最后由 lee1892 于 2013-9-6 09:24 编辑
incognito 发表于 2013-9-5 23:27
m refers to the m^th prime above or below n.

m是负的好说
正的嘛,即便是1,也不可能快速找到
不限定n的大小?

...
前面提到的2种素性测试,都是随机性测试,对于较大的质数能给出一个是否为质数的概率性结果,尽管结果非常准。

2005年有人发表了名为AKS的素性测试方法,确定的且不基于任何未证明的猜想,但慢一些。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-6 10:56 | 显示全部楼层
本帖最后由 香川群子 于 2013-9-6 11:10 编辑
incognito 发表于 2013-9-5 23:27
m refers to the m^th prime above or below n.


返回距当前数的第k个素数。
k=0 时按k=1处理
k=1 时返回下一个素数
k=2 时返回第2个素数
……
k=-1 返回前一个素数
k=-2 返回前2个素数 → 到 1时终止。
  1. Function NxtPrime&(ByVal n&, Optional k& = 1) '次の質数
  2.     Dim b&, c&, f&
  3.     On Error Resume Next
  4.     If k < 0 Then f = -2 Else f = 2: If k = 0 Then k = 1
  5.     If n Mod 2 = 0 Then NxtPrime = n - f / 2 Else NxtPrime = n
  6.     b = 1
  7.     Do
  8.         NxtPrime = NxtPrime + f: n = NxtPrime: c = Int(n ^ 0.5)
  9.         Do While b < c
  10.             b = b + 2: If n Mod b = 0 Then b = 1: Exit Do
  11.         Loop
  12.         If b > 1 Then k = k - f / 2
  13.     Loop Until k = 0 Or n < 3 '这里的容错处理比较复杂……略过了
  14. End Function
复制代码
该函数表现不错,但对于n<3时也 一律返回5作为下一个素数。

即返回:  1、5、7、11……
而不是:  1、2、3、5、7、11…… 因为这部分的容错比较麻烦,忽略不搞了。

1        5        7        11        13        17        19
2        5        7        11        13        17        19
3        5        7        11        13        17        19
4        5        7        11        13        17        19
5        7        11        13        17        19        23
6        7        11        13        17        19        23
7        11        13        17        19        23        29
8        11        13        17        19        23        29
9        11        13        17        19        23        29
10        11        13        17        19        23        29


同样的,向下查找时也存在这个问题:
当前数        3        2        1        0        -1        -2        -3
1        9        7        5        5        -1        -1        -1
2        9        7        5        5        1        1        1
3        9        7        5        5        1        1        1
4        9        7        5        5        1        1        1
5        11        9        7        7        1        1        1
6        11        9        7        7        5        3        1
7        15        13        11        11        5        3        1
8        15        13        11        11        7        5        3
9        15        13        11        11        7        5        3
10        15        13        11        11        7        5        3


当前数        -1        -2        -3        -4        -5        -6        -7
1        -1        -3        -5        -7        -9        -11        -13
2        1        -1        -3        -5        -7        -9        -11
3        1        -1        -3        -5        -7        -9        -11
4        1        -1        -3        -5        -7        -9        -11
5        1        -1        -3        -5        -7        -9        -11
6        5        1        -1        -3        -5        -7        -9
7        5        1        -1        -3        -5        -7        -9
8        7        5        1        -1        -3        -5        -7
9        7        5        1        -1        -3        -5        -7
10        7        5        1        -1        -3        -5        -7

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-6 13:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
重新优化了一下,改进如下:
  1. Function NxtPrime(ByVal n&, Optional k& = 1) '次の質数
  2.     Dim b&, c&, f&
  3.     If k = 0 Then NxtPrime = IsPrime(Abs(n)): Exit Function '質数判断
  4.     If k < 0 Then f = -2 Else f = 2
  5.     NxtPrime = n - IIf(n Mod 2, 0, f / 2)
  6.     Do
  7.         NxtPrime = NxtPrime + f: n = Abs(NxtPrime)
  8.         b = 1: c = Int(n ^ 0.5)
  9.         Do While b < c
  10.             b = b + 2: If n Mod b = 0 Then b = 0: Exit Do
  11.         Loop
  12.         If b Or n < 4 Then k = k - f / 2
  13.     Loop Until k = 0
  14. End Function
  15. Function IsPrime$(ByVal n&) '質数判断
  16.     If n < 4 Then IsPrime = "素数": Exit Function
  17.     If n Mod 2 Then IsPrime = "素数" Else IsPrime = "合数": Exit Function
  18.     b& = 1: m& = Int(n ^ 0.5)
  19.     Do
  20.         b = b + 2: If n Mod b = 0 Then IsPrime = "合数": Exit Function
  21.     Loop While b < m
  22. End Function
复制代码
k参数=0 时,判断当前数为素数或合数
【默认】k=1时,返回比当前数大的第1个素数
k=2 时,返回比当前数大的第2个素数
……
k=n 时,返回比当前数大的第n个素数

……
……
k=-1时,返回比当前数小的第1个素数
k=-2时,返回比当前数小的第2个素数
……
k=-n时,返回比当前数小的第n个素数


…………
返回的素数序列中,不包含偶数2,但包含1






TA的精华主题

TA的得分主题

发表于 2013-9-6 14:19 | 显示全部楼层
n的大小,还是搂主决定为妥。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-6 23:19 | 显示全部楼层
incognito 发表于 2013-9-6 14:19
n的大小,还是搂主决定为妥。

在Excel VBA中,只能使用Long型整数,不超过 2^31-1=2147483647

TA的精华主题

TA的得分主题

发表于 2013-9-7 08:25 | 显示全部楼层
In 1772, Leonhard Euler discoveried this mersenne number.

TA的精华主题

TA的得分主题

发表于 2013-9-30 09:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-21 20:59 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的第一反应是用字典,虽然笨,但易理解
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 11:07 , Processed in 0.032185 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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