You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

有理数成分复数的精确平方根判定与计算需求

有理数成分复数的精确平方根判定与计算需求

嗨,这个需求我太熟悉了——毕竟Scheme对精确/非精确数的区分要求很严格,咱们得把这个问题拆解清楚,一步步来实现:

首先明确核心问题:给定一个实部和虚部都是**有理数(精确数)**的复数 (a + bi),我们要判断是否存在另一个实部虚部也都是有理数的复数 (x + yi),使得 ((x + yi)^2 = a + bi);如果存在,就输出这个精确的平方根,否则就返回非精确的浮点数结果。

推导核心公式

咱们从复数平方的定义出发:
[
(x + yi)^2 = x^2 - y^2 + 2xyi
]
和原复数 (a + bi) 对应,就能得到两个等式:

  • (x^2 - y^2 = a)
  • (2xy = b)

接下来分情况讨论:

情况1:虚部b=0(原复数是实数)

这时候就是普通的实数平方根问题:

  • 如果 (a \geq 0):判断a是否是某个有理数的平方(即分子、分母都是完全平方数),是的话返回 (\pm\sqrt{a})(精确有理数);否则返回非精确浮点数。
  • 如果 (a < 0):判断 (|a|) 是否是有理数的平方,是的话返回 (\pm i\sqrt{|a|});否则返回非精确浮点数。

情况2:虚部b≠0(原复数是虚数)

咱们把第二个方程变形为 (y = \frac{b}{2x})(x肯定不为0,否则b也会是0,矛盾),代入第一个方程:
[
x^2 - \frac{b2}{4x2} = a
]
两边乘以 (4x^2) 得到关于 (x^2) 的二次方程:
[
4x^4 - 4ax^2 - b^2 = 0
]
设 (z = x^2),解这个方程得:
[
z = \frac{a \pm \sqrt{a^2 + b^2}}{2}
]
要让x是有理数,必须满足两个条件:

  1. (\sqrt{a^2 + b^2}) 是有理数——因为a、b都是有理数,所以 (a^2 + b^2) 是有理数,它的平方根要是有理数,就必须分子分母都是完全平方数。
  2. 上面的z必须是非负的有理数,而且z本身也是某个有理数的平方(这样x才是有理数)。

满足这两个条件后,我们就能算出x,再通过 (y = \frac{b}{2x}) 得到y,y必然也是有理数(因为b和x都是有理数)。

用你的例子验证

给定复数 (-\frac{119}{225} + \frac{8}{15}i):

  1. 计算 (a^2 + b^2 = (\frac{119}{225})^2 + (\frac{8}{15})^2 = \frac{119^2 + (8 \times 15)2}{2252} = \frac{14161 + 14400}{50625} = \frac{28561}{50625})
  2. 28561是169的平方,50625是225的平方,所以 (\sqrt{a^2 + b^2} = \frac{169}{225})
  3. 计算z:(\frac{-\frac{119}{225} + \frac{169}{225}}{2} = \frac{\frac{50}{225}}{2} = \frac{1}{9}),这是 (\frac{1}{3}) 的平方,符合条件
  4. 取x=(\frac{1}{3}),计算y:(\frac{\frac{8}{15}}{2 \times \frac{1}{3}} = \frac{8}{15} \times \frac{3}{2} = \frac{4}{5})
    最终得到精确平方根 (\frac{1}{3} + \frac{4}{5}i),和你要的结果一致。

Scheme实现思路

  1. 提取成分:从输入复数中取出实部a和虚部b(都是有理数,分子分母互质)。
  2. 辅助函数:写一个判断整数是否为完全平方数的函数,比如对正整数n,计算其整数平方根后平方,看是否等于n。
  3. 分情况处理
    • 当b=0时,按实数平方根逻辑处理。
    • 当b≠0时:
      • 计算 (s = a^2 + b^2),表示为分子分母互质的有理数(分母会是平方数,只需判断分子是否为完全平方数)。
      • 如果s不是平方数,直接返回非精确浮点数平方根。
      • 计算sqrt_s(有理数),再计算z的两个可能值,取非负的那个。
      • 判断z是否为平方数,是的话算出x的两个可能值,再对应算出y,返回精确复数;否则返回非精确结果。

备注:内容来源于stack exchange,提问作者Elektito

火山引擎 最新活动