找回密码
 欢迎注册
查看: 2137|回复: 13

[原创] 2^64内基于米勒罗宾素性测试的素性证明算法

[复制链接]
发表于 2023-4-25 09:30:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
对n进行基b的米勒罗宾素性测试定义为MR(n, b)
算法步骤
1、首先进行基 2 的 MR(n, 2),
          如果测试失败,返回 n 是合数,结束
          否则,继续 2
2、对 n 求 s = $|log_2(log_2(n))|$
3、找到最小正整数 $t_0$ 满足 $t_0^s \ge n$
4、对于大于等于 $t_0$ 的连续素数 t 执行 s + 3 次 MR(n, t),
          如果某次测试失败,返回 n 是合数,结束
          如果全部通过,返回 n 是素数,结束

此时,只有 214021506061375741 失败
如果改成 $t_0$ 开始连续整数,则有2个失败
9450361108305253
1578072131184991861
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 09:50:39 | 显示全部楼层
不要搞素数判定了,浪费时间!
有现成的BPSW算法,还不够好吗?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 09:53:03 | 显示全部楼层
用你的算法试试这个大合数

2887148238050771212671429597130393991977609459279722700926516024197432\
3037991527331163289831446392259419778031109293496555784189494417409338\
0561511397999942154241693397290542371100275104208013496673175515285922\
6962916775325475044445856101949404200039904432116776619949629539250452\
6987193290703735640322737012784538991261203092448414947289768854060249\
76768122077071687938121709811322297802059565867

https://bbs.emath.ac.cn/forum.ph ... 8&fromuid=14149
如何分解这个变态的卡米歇尔强伪素数?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-4-25 10:01:52 | 显示全部楼层
汇编写的MR(n, b)

  1. ;bool mrtest(uint64_t p, uint64_t b)
  2. ;win64下,前4个参数如果是整数或者指针保存到rcx, rdx, r8, r9
  3. ;如果是浮点数,保存到xmm0, xmm1, xmm2, xmm3
  4. ;如果是混合参数,则按照对应位置选择寄存器
  5. ;多于4个的参数从右到左压栈,同时栈顶为前4个参数保留32字节影子空间
  6. ;函数内可以自由使用rax, rcx, rdx, r8, r9, r10, r11, xmm0-xmm5
  7. ;其他寄存器需要使用时候,则要保证在退出函数时恢复值
  8. ;返回值保存在rax内,如果是浮点数保存在xmm0
  9. ;linux, FreeBSD, MacOS等64位系统则遵循另外一个规则
  10. ;前6个参数保存到rdi, rsi, rdx, rcx, r8, r9,
  11. ;浮点数则保存到xmm0-xmm5
  12. ;多于6个从右到左依次压栈,没有影子空间,
  13. ;函数内可以自由使用rax, rcx, rdx, rsi, rdi, r8, r9, r10, r11
  14. ;返回值保存到rax或者xmm0
  15. USE64
  16. section .bss
  17. section .data
  18. section .text

  19. GLOBAL mrtest

  20. mrtest:
  21. %ifidn __OUTPUT_FORMAT__, win64
  22.   mov r8, rcx
  23.   mov r9, rdx
  24. %else
  25.   mov r8, rdi
  26.   mov r9, rsi
  27. %endif
  28. ;r8 = p, r9 = b
  29.   mov r10, r8
  30.   mov rax, 1
  31.   movq xmm0, rax
  32.   movq xmm3, r8
  33. ;xmm3 = p-1
  34.   psubq xmm3, xmm0
  35.   pxor xmm2, xmm2
  36. ;xmm2 = 1
  37.   paddq xmm2, xmm0
  38.   sub r10, 1
  39. ;r10 = p - 1
  40.   bsf rcx, r10
  41. ;rcx = k
  42.   shr r10, cl
  43. ;r10 = m, p - 1 = m * 2^k
  44.   mov r11, 1
  45.   cmp r10, 1
  46.   je jmp1
  47. loop0:
  48.   cmp r10, 0
  49.   je jmp0
  50.   test r10, 1
  51.   jz  loop1
  52. ;r11 = r11 * r9 % r8
  53.   mov rax, r11
  54.   mul r9
  55.   div r8
  56.   mov r11, rdx
  57. loop1:
  58. ;r9 = r9 * r9 % r8
  59.   mov rax, r9
  60.   mul r9
  61.   div r8
  62.   mov r9, rdx
  63.   shr r10, 1
  64.   jmp loop0
  65. jmp0:
  66. ; xmm0 = (r11 == 1 || r11 == p-1)? -11 : 0
  67.   movq xmm0, r11
  68.   movq xmm1, r11
  69.   pcmpeqq xmm0, xmm2;xmm0=r11 == 1?(-1):0
  70.   pcmpeqq xmm1, xmm3;xmm1=r11 == (p-1)?(-1):0
  71.   por xmm0, xmm1
  72. ;if (rax = -xmm0 == 1) then exit
  73.   movq rax, xmm0
  74.   neg rax
  75.   cmp rax, 1
  76.   je exit0
  77.   mov r9, r11
  78. jmp1:
  79.   sub rcx, 1
  80.   jz exit0
  81. loop3:
  82.   mov rax, r9
  83.   mul r9
  84.   div r8
  85.   mov r9, rdx
  86. ;xmm1 = r9 == p-1? (-1):0
  87.   movq xmm1, r9
  88.   pcmpeqq xmm1, xmm3
  89.   movq rax, xmm1
  90.   neg rax
  91.   cmp rax, 1
  92.   je exit0
  93.   sub rcx, 1
  94.   jnz loop3
  95. exit0:   
  96.   ret
复制代码


测试代码
  1. extern bool mrtest(uint64_t p, uint64_t b);

  2. uint64_t ts[8][2] = {{257,2},  {255,2}, {2047, 2},  {121, 3},
  3.      {10095020520187, 2}, {581130733, 3}, {55031295157, 234587},
  4.      {55031295179, 234587}};

  5. void testmrtest( void )
  6. {
  7.   for (uint64_t i = 0; i < 8; i ++)
  8.     if (mrtest(ts[i][0], ts[i][1]))
  9.       printf("mrtest(%lu, %lu) is true\n", ts[i][0], ts[i][1]);
  10.     else
  11.       printf("mrtest(%lu, %lu) is false\n", ts[i][0], ts[i][1]);
  12. }

  13. int main( void )
  14. {  
  15.     testmrtest();
  16. }
复制代码


假设汇编名为 mr.asm, C代码 mrtest.c
linux下
nasm -f elf64 mr.asm -o mr.o
gcc mrtest.c mr.o -o mrtest
windows下
nasm -f win64 mr.asm
gcc mrtest.c mr.obj -o mrtest
即可生成测试程序

汇编代码也可以用yasm编译通过

点评

@nyy,你不明白我主要在做什么,这是64位代码,大数不行的,其实我主要是为了搞明白64汇编怎么和C语言混合编程  发表于 2023-4-25 11:34
nyy
测试我发的那个数了吗  发表于 2023-4-25 10:28
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 12:34:16 | 显示全部楼层
其实我主要是为了搞明白64汇编怎么和C语言混合编程


你还不如直接从机器语言开始编程,混合编程我不会,我连汇编都不会,我只会简单弱智的mathematica
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 13:31:02 | 显示全部楼层

假设
n=2887148238050771212671429597130393991977609459279722700926516024197432\
3037991527331163289831446392259419778031109293496555784189494417409338\
0561511397999942154241693397290542371100275104208013496673175515285922\
6962916775325475044445856101949404200039904432116776619949629539250452\
6987193290703735640322737012784538991261203092448414947289768854060249\
76768122077071687938121709811322297802059565867

那么Log[2, Log[2, n]],对2取两次对数,结果是10.3631,
但是这个n,能通过1到307的强伪素数的测试!

点评

那就用二次域算法  发表于 2023-4-25 14:06
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 14:35:04 | 显示全部楼层

那你二次域给我看看呀
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-25 14:42:44 | 显示全部楼层
nyy 发表于 2023-4-25 13:31
假设
n=2887148238050771212671429597130393991977609459279722700926516024197432\
30379915273311632 ...

https://bbs.emath.ac.cn/forum.ph ... 3&fromuid=14149

用lucas U lucas V就行了!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-4-25 16:08:46 | 显示全部楼层
各一次基2,3的MR
然后卢卡斯测试或者二次域测试,我有时间比较下哪个快
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-4-26 13:44:55 | 显示全部楼层
无心人 发表于 2023-4-25 16:08
各一次基2,3的MR
然后卢卡斯测试或者二次域测试,我有时间比较下哪个快

整天研究素数判定,难道你还想搞出个大新闻???????
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-28 06:51 , Processed in 0.054552 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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