用余数缩小问题

先用较大数a除以较小数b,写成a等于q倍b加余数r,其中r小于b。若r为零,b就是最大公约数;否则改为处理b与r,继续同样步骤。

例如1071除以462余147,462除以147余21,147除以21余零,结果为21。一次带余除法把同一较小数的多次相减合在一起,减少了逐次相减的操作。

参考:[1] [2]

为什么共同因子没有丢失

如果一个数同时整除a和b,它也整除a减q倍b所得的r。反过来,若它同时整除b和r,也整除q倍b加r所得的a。两对数因此具有相同的共同因子,最大者也相同。

每次未结束时,新的正余数都小于前一个除数。在通常的正整数中,不存在无限下降的这种序列,所以过程最终会遇到零余数。保持答案与保证终止,是算法论证中不同的两部分。

参考:[1] [2]

古代表述与计算实现

卷七第二题针对并非互素的两个数寻找最大共同度量,和前一题讨论单位余量的情形相配。古代把单位与数作区分,因而不能把该题原话直接当成现代程序对所有输入的完整接口说明。

现代实现可用循环或递归计算余数,也需确定输入范围与零值处理。对很大的整数,一次除法本身也有计算成本;算法的步骤数量与实际算术耗时不能无条件视为同一个指标。

参考:[1] [2]