【问题标题】:Obfuscate multiplication by 2 [closed]混淆乘以 2 [关闭]
【发布时间】:2011-10-18 19:04:31
【问题描述】:

帮我想出一个混淆的方法来将一个数字乘以 2,精确到小数点后二位。

想法:

  • 使用俄语乘法技术
  • 三角/其他数学恒等式
  • 蒙特卡罗方法
  • 当然还有 CS 诡计的加分

编辑:

刚刚记住,用有效数字而不是精确的小数位来考虑这一点可能更合适。所以选择 4 个匹配的前导数字。

【问题讨论】:

  • 我标记为作业。这是正确的吗?
  • @user973810,正是我的观点。 ;) 另外,回复时使用@;它甚至带有自动完成功能,因此您不必学习拼写。 :)
  • @user973810:由于这是 stackoverflow,我将假设它涉及代码。你对数值表示等做了什么样的假设? BCD vs IEEE 754 vs ASCII vs blah blah 可以提供帮助。我确实知道他们正在教孩子们一种新的奇怪的乘以大数的形式,这似乎非常费力(我假设要尽量减少死记硬背)。执行时间是一个因素吗?即,您是否必须停留在时尚和晶圆厂的领域? :-)
  • @ArtTaylor 假设输入是您偏好语言的浮点数。如果表示方式有所作为,请随意利用它。
  • 在苏维埃俄罗斯,数字乘以

标签: math obfuscation


【解决方案1】:

以下 perl 单行语句将第一个命令行参数加倍:

perl -e '$/=$\=shift;map$\+=$//(++$|+$|)**$_,(++$...$=);print'

你可能会说使用 perl 是作弊,因为 perl 中的所有内容都被混淆了。你不会完全错的。

这是(未混淆的)python 中略有不同的方法:

import math
def double(n) :
    if n == 0 :
        return 0
    a = b = n
    for i in range(1,100) :
        a = 2 + 1.0/a
    a = a - 1
    for i in range(1,100) :
        b = a * b
        a = math.sqrt(a)
    return b

【讨论】:

  • 两个很棒的条目。 perl 是做什么的?
  • perl 使用 x + x/2 + x/4 + x/8 + x/16 + ... = 2x 的事实。
【解决方案2】:

如果目标是为了它而混淆,那么没有什么比一些红鲱鱼和无用的对象结构更能分散阅读代码的人对你真正目标的注意力。例如,不是直接使用任何数字,您可以从字典中提取它,或者从另一个对象的长度中获取它(例如大小为 2 的列表),或者更好的是,将数字 2 隐藏在某个字符串中,然后使用难以阅读的模式对其进行正则表达式。

【讨论】:

  • 所有好主意,但我仍然想使用一些奇怪的算法,而不仅仅是乘法或加法之类的。
【解决方案3】:

既然你想让简单的复杂,你可以用复数做一些愚蠢的事情。假设您有任何可用于复杂算术的库,例如,您可以利用数学中最漂亮的方程式:e^(pi*i) + 1 = 0。例如在 Java 中使用 Apache Commons Math(当然你会混淆变量名):

Complex i = new Complex(0, 1);
double two = i.multiply(Math.PI).exp().getReal() + 3 +  i.multiply(Math.PI).exp().getImaginary()*5;

实部是 -1,所以加 3 得到 2。虚部是 0,所以将它乘以 5 再相加是一个没有任何作用的红鲱鱼。*

只要是为了好玩,您可以尝试使用其他类似标识的其他变体。但是,我不建议依靠这种类型的东西来真正混淆真实产品中的代码。有一些包可以为您混淆代码,并且自动将变量名称更改为乱码对阻止人类大有帮助(同时仍然让代码保持可读性以保持开发人员的理智)。

*在浮点运算中,虚部可能正好不为 0,但您说您对精确到小数点后两位感兴趣。

【讨论】:

  • 我喜欢复杂的数学和添加 0 个想法。做得很好。
【解决方案4】:

由于这是家庭作业,我不想只给你答案,而是考虑以二进制表示的数字,以及你可以使用哪些类型的二进制操作数可能有助于进行乘法运算。

【讨论】:

  • 这不是家庭作业,我不认为位移是混淆。我正在考虑这些方面的一些事情,但是对于一个特定的数字:stackoverflow.com/questions/260511/…
  • @user973810:好吧,我不确定它有多基本。当我看到作业时,我认为它会像位移一样。
猜你喜欢
  • 2010-09-05
  • 2010-11-08
  • 1970-01-01
  • 2013-02-19
  • 2012-08-22
  • 2010-10-20
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多