公告:本站正式转型为非交互式静态网站!
转型:本站将通过笔记和博客的形式继续为大家服务,关于 Mathematica 问答服务请移步至QQ群:365716997
联系:如有问题请联系QQ群管理员,或发送邮件至:lixuan.xyz@qq.com。
感谢:最后非常感谢大家多年来的支持与帮助!
参考《互联网跟帖评论服务管理规定》《中华人民共和国网络安全法》《网络信息内容生态治理规定》《互联网用户账号信息管理规定》

—— 2022-11-27

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
5.8k 浏览
ComplexContinuedFraction[x_] := Catch[
  For[k = {}; i = 0,
   i < -1,
   i++,
   If[GIRCF[x, i][[2]] === Indeterminate,
    Append[k, Indeterminate]; Throw[k],
    (*如果余值出现未定义,将未定义加入到列表中并输出结果*)
    If[GIRCF[x, i][[2]] === 0, Throw[k], 
     Append[k, GIRCF[x, i][[1]]]]]]]
(*如果余值未出现0,GIRCF[x,i]\[LeftDoubleBracket]1\[RightDoubleBracket]\
加入到列表直到余值为0并输出结果*)

(*可行性测试*)
ComplexContinuedFraction[466611/200 + (1332201 I)/2000]

以上是没有输出的函数。

==========================================================================

前置代码:

GaussianIntegerRegularContinuedFraction[fn___] := GIRCF[fn];
GIRCF[x_, dx_, k_Integer] := GIRCF`Core[Rationalize[x, dx], k];
GIRCF[x_, k_Integer] := GIRCF`Core[Rationalize[x], k];
(*反正最后都是按有理数处理就不需要数值近似.*)
GIRCF`Core[x_, k_] := Block[{GIRCF`m = GIRCF`Core[x, k - 1][[2]]},
    If[FractionalPart[GIRCF`m] === 0, {GIRCF`m, 0},
    (*余值为0意味着规范连分数化的结束*)

     
     If[IntegerPart[GIRCF`m] === 0,
      {GIRCF`m, Indeterminate},
      (*并非每一个复数都可以在高斯整数下被规范连分数化*)
      {IntegerPart[GIRCF`m], 1/FractionalPart[GIRCF`m]}]]] /; k >= 1;
GIRCF`Core[x_, 0] :=
  If[FractionalPart[x] === 0, {x, 0}, {IntegerPart[x], 1/
    FractionalPart[x]}];
GIRCF`Core[x_, k_] := {IntegerPart[x*10^k], IntegerPart[x*10^k] - x} /;
    k <= -1;



(*可行性测试1*)
a = Rationalize[2333.055 + 666.1005 I];
Do[Print[GIRCF`Core[a, n]], {n, 9}]

(*可行性测试2*)
a = Rationalize[2333.12345 + 666.54321 I];
Do[Print[GIRCF`Core[a, n]], {n, 8}]

 

分类:矩阵 | 用户: EmberEdison (806 分)
修改于 用户:EmberEdison
故意的,令其不被For停止,难道Throw后面要加Return?
For没用,所以根本就没Throw啊。
写i < 1000000或者i > 1000000也没用啊
那就是另外一个问题了。至少你需要贴出能真实反映你问题的代码。
现在好了。最少 8 个字符

1个回答

+2 投票
 
已采纳

其实这个问题很简单。

首先i<-1必须得改,因为i<-1等于For完全没循环,代码等价于:

Catch[For[j = 1, j < -2, j++]]

For里等价于不存在Throw,然后For本身并不返回值,所以Catch无任何输出。

改成i<10后,在运行发现有输出了,但是输出是空括号{}。理由很简单,

Table[GIRCF[466611/200 + (1332201 I)/2000, i][[2]], {i, 0, 10}]

可以发现前八项是个不等于0或Indeterminate的数,第9项开始等于0

所以For循环里,前8次走的是Append这个Append[k, GIRCF[x, i][[1]]]这个分支。

那么问题来了,你需要去学习Append和AppendTo的区别。

用户: 苹果 (2.2k 分)
采纳于 用户:EmberEdison
For循环慢啊。
而且也是一种练习...Do会转化,For我不会
这段程序不慢啊....
就当练习题呢?如何利用矩阵求际之类的技术优化?
算了我另外开一题问吧
...