如果i%Prime[j]==0
,即i=t*Prime[j]
。
当标记 i*Prime[j+1]
时,
i*Prime[j+1]
这个数并不是最小质因子与最大剩余因子的乘积的形式,
因为i
可以被拆成t*Prime[j]
,说明Prime[j+1]
不是这个数的最小质因子(Prime是升序数组),
i*Prime[j+1]
这个数应该被拆成 (t*Prime[j+1])*Prime[j]
,
这样才是最小质因子与最大剩余因子的乘积的形式,
其中最小质因子为Prime[j]
,最大剩余因子为t*Prime[j+1]
,
也就是说 i*Prime[j+1]
这个数将在循环遍历到 i=t*Prime[j+1]
时被标记。
同理,当标记 i*Prime[j+k]
时,
i*Prime[j+k]
这个数并不是最小质因子与最大剩余因子的乘积的形式,
因为i
可以被拆成t*Prime[j]
,说明Prime[j+k]
不是这个数的最小质因子(Prime是升序数组),
i*Prime[j+k]
这个数应该被拆成 (t*Prime[j+k])*Prime[j]
,
…
也就是说 i*Prime[j+k]
这个数将在循环遍历到 i=t*Prime[j+k]
时被标记。
所以一旦i%Prime[j]==0
,i
就可以被拆成t*Prime[j]
,
不再满足数拆分成最小质因子与最大剩余因子的乘积的形式,
就break退出该层循环。
也就是说,如果一个数被标记,那肯定是由它的最小质因子与最大剩余因子的乘积标记的,这是标记的唯一性
。
又因为任何一个大于1的整数都可以唯一分解成有限个质数的乘积,而Prime保存了当前发现的所有质数,
当计算进行下去,所有范围的数都可以被分解成***形式,这是标记的无遗漏性
。
真是合情合理
。