求函数f(n)=l+m的闭合形式(n=2^l·m,l非负整数、m正奇数)
嘿,针对你提出的这个问题,我来分享几个实用的思路:
首先得明确,你定义的函数f(n)本质上是把正整数n分解为2^l · m(l是非负整数,m是正奇数)后,取指数l与奇数m的和。对于非2幂次的偶数,其实我们可以从这几个角度来描述它的“闭合形式”:
用数论标准函数表示
这里的l其实就是数论里的2-adic赋值函数,记作v₂(n),它的定义就是n中包含的2的因子的最高次幂的指数(简单说就是n能被2整除多少次)。所以f(n)可以直接写成:f(n) = v₂(n) + n / 2^{v₂(n)}
这个表达式是完全精确的,而且是数论领域里的标准表述。比如拿n=12来说,v₂(12)=2,代入后就是2 + 12/4 = 5,和计算结果一致。基于二进制表示的直观表述
从二进制的角度看,n的二进制末尾的0的个数就是l,去掉这些末尾0之后剩下的二进制数对应的十进制值就是m。所以f(n)也可以描述为:f(n) = (n的二进制末尾0的个数) + (n右移末尾0的个数位后得到的数)
这个方式非常直观,计算起来也很方便,比如n=18是二进制10010,末尾1个0,右移1位得到9,所以1+9=10,完全正确。接受“分场景的闭合形式”
其实很多依赖于整数分解的函数,本身就没有那种只用到加减乘除、对数等基础函数的单一闭合形式——因为整数分解本身就没有这样的闭合表达式。所以我们可以把f(n)的完整闭合形式分场景写出来:当n为奇数时,
f(n)=n;
当n为2的幂次时,f(n)=log₂(n)+1;
当n为非2幂次的偶数时,f(n)=v₂(n) + n/2^{v₂(n)}
这样的分场景表述已经是最清晰、最精确的闭合形式了。
另外,如果你是在编程里需要计算这个函数,用v₂(n)的逻辑很容易实现,比如在Python里可以用(n & -n).bit_length() - 1来快速得到v₂(n),然后再计算n除以2的l次方加上l即可。
内容的提问来源于stack exchange,提问作者asdfghjk

