- 注册时间
- 2008-2-6
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 51573
- 在线时间
- 小时
|
楼主 |
发表于 2019-10-9 15:41:46
|
显示全部楼层
- function isSquareOrDivBy2357(n)
- if gcd(n, 840) != 1
- return true
- end
- t = n % 840
- if t in [1, 121, 169, 289, 361, 529]
- sq = isqrt(n)
- return sq * sq == n
- else
- return false
- end
- end
- function isSquare1(n)
- sq = isqrt(n)
- return sq * sq == n
- end
- q11 = [1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0]
- q63 = [1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0,
- 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1,
- 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0]
- q64 = [1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0,
- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 1, 0, 0, 0, 0, 0, 0]
- q65 = [1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1,
- 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
- 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
- 1, 1, 0, 0, 0, 0, 1, 0, 0, 1]
- function isSquare2(n)
- if q64[n % 64 + 1] == 0
- return false
- end
- r = n % 45045
- if q63[r % 63 + 1] == 0
- return false
- end
- if q65[r % 65 + 1] == 0
- return false
- end
- if q11[r % 11 + 1] == 0
- return false
- end
- sq = isqrt(n)
- return sq * sq == n
- end
- base = big(10)^16384
- test = []
- for i in range(0, stop = 65535)
- push!(test, base + i)
- end
- global cnt = 0
- println("1")
- @time for t in test
- if isSquareOrDivBy2357(t)
- global cnt += 1
- end
- end
- println(cnt)
- global cnt = 0
- println("2")
- @time for t in test
- if isSquare1(t)
- global cnt += 1
- end
- end
- println(cnt)
- global cnt = 0
- println("3")
- @time for t in test
- if isSquare2(t)
- global cnt += 1
- end
- end
- println(cnt)
复制代码
1
0.361999 seconds (1.33 M allocations: 33.778 MiB, 10.00% gc time)
50556
2
6.500475 seconds (590.98 k allocations: 647.587 MiB, 1.93% gc time)
1
3
0.529858 seconds (1.51 M allocations: 41.500 MiB, 5.29% gc time)
1
测试表明当待测试数较小时,直接开平方的时间最少,Cohen的方法最差
当待测试数字很大时候(大约大于10^1024),我提到的方法较好,但是不能反应实际的平方数,Cohen的其次,直接开平方则较差
所以推荐Cohen的平方测试算法 |
|