微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何编写一个函数来测试一个正整数 n 是否可以写成两个平方整数之和,i e. n = i^2 +j^2 与 i; j 2 N>0

如何解决我如何编写一个函数来测试一个正整数 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?