如何解决我如何编写一个函数来测试一个正整数 n 是否可以写成两个平方整数之和,i e. n = i^2 +j^2 与 i; j 2 N>0
我一直在努力解决这个问题,但到目前为止我还没有做到。我怎么能用 R 编写这段代码?
解决方法
遗憾的是,我无法添加评论,但我想这篇维基百科文章确实可以帮助您: https://en.wikipedia.org/wiki/Sum_of_two_squares_theorem
基本上,您应该将 n 分解为其素数,然后检查:
大于 1 的整数可以写成两个平方的和,当且仅当它的素数分解不包含项 p^k,其中素数 p = 3 mod 4 且 k 是奇数。
,实际上您可以构建一个用户函数 f
,如下所示
f <- function(n) {
p <- seq(floor(sqrt(n - 1)))
q <- sqrt(n - p**2)
idx <- q == floor(q)
data.frame(A = p[idx],B = q[idx])
}
这样
> f(9)
[1] A B
<0 rows> (or 0-length row.names)
> f(100)
A B
1 6 8
2 8 6
> f(500)
A B
1 4 22
2 10 20
3 20 10
4 22 4
> f(1000)
A B
1 10 30
2 18 26
3 26 18
4 30 10
其中 f(9)
给出一个空数据框意味着 9
不能分解为两个平方整数之和。
应用Blop提到的定理
library(gmp)
library(data.table)
is_sum_two_squared_ints <- function(x){
factor <- gmp::factorize(x)
factor_mod4 <- gmp::mod.bigz(factor,4)
# converting from Big Integer to integer,assuming your number isn't too big
dt <- data.table(factor = as.integer(factor),factor_mod4 = as.integer(factor_mod4))
n_meets_criteria <-
dt[,.N,.(factor,factor_mod4)][factor_mod4 == 3 & N %% 2 == 1,.N]
return(n_meets_criteria == 0)
}
is_sum_two_squared_ints(25)
# [1] TRUE
is_sum_two_squared_ints(3)
# [1] FALSE
is_sum_two_squared_ints(220)
# [1] FALSE
is_sum_two_squared_ints(116)
# [1] TRUE
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。