|
楼主 |
发表于 2017-11-15 09:59
|
显示全部楼层
作为一次失败的尝试,贴上代码,以求来者。。。。。
- Dim PrimeArr, tstPrimeArr, tstN%, tstprime
- Sub problem146()
- tm = Timer
- nmax = 15 * 10 ^ 7
- Dim n, n2, kk%
- arr = Array(1, 3, 7, 9, 13, 27)
- tstPrimeArr = Array(2, 3, 7, 61, 89)
- ReDim brr(1 To nmax) As Byte
- For Each a In Array(3, 7, 13) '先筛掉一遍3,7,13的倍数
- For j = a To nmax Step a
- brr(j) = 1
- Next
- Next
- On Error GoTo ext
- For n = 10 To nmax Step 10
- If brr(n) = 0 Then
- If n Mod 7 <> 3 And n Mod 7 <> 4 Then GoTo nextn
- n2 = CDec(n) * CDec(n)
- For kk = 0 To 5
- If Is_Prime(CDec(n2) + CDec(arr(kk))) = False Then GoTo nextn
- Next
- If Is_Prime(CDec(n2) + CDec(21)) = True Then GoTo nextn
- res = res + n
- Debug.Print n, res, Timer - tm
- End If
- nextn: Next
- Debug.Print res, "共运行" & Timer - tm & "秒"
- Exit Sub
- ext: Debug.Print "error in :N="; n, "tstprime="; tstprime, CDec(n2) + CDec(arr(kk))
- End Sub
- Public Function Is_Prime(n) As Boolean '判断N是不是质数
- 'Miller-Rabbin 素数测试算法
- 'tstPrimeArr = Array(2, 3, 7, 61, 24251) '据说用这五个数足够了
- For tstN = 0 To UBound(tstPrimeArr)
- tstprime = tstPrimeArr(tstN)
- If Pow(tstprime, n - 1, n) <> 1 Then Exit Function
- Next
- Is_Prime = True
- End Function
- Function Pow(a, b, c) '快速幂a^b mod c 当aa超过2.8*10^14,aa*aa会超过dec精度出错!!
- ans = 1
- aa = a: xx = b
- aa = Modular(aa, c) '预处理,使得a处于c的数据范围之下
- Do While xx > 0 '二进制的移位操作,相当于每次除以2,用二进制看,就是我们不断的遍历b的二进制位
- tmp = Modular(xx, 2) '从后往前的二进制位
- If tmp = 1 Then ans = Modular(CDec(ans) * CDec(aa), c) '如果b的二进制位不是0,那么我们的结果是要参与运算的
- aa = Modular(CDec(aa) * CDec(aa), c) ' 不断的加倍
- xx = Int(xx / 2) '二进制左移一位
- Loop
- Pow = ans
- End Function
- Function Modular(a, b) '返回a mod b
- Dim nb
- If a < b Then
- Modular = a
- ElseIf a = b Then
- Modular = 0
- Else
- Modular = a - Int(a / b) * b
- End If
- End Function
复制代码 |
|