找到3的10-adic立方根


24

我喜欢将10 adic数字视为无限向左移动的数字,或者是一个非常大的10的幂模的整数。

事物无限地向左移动并消失。要了解我的意思,请注意...6667 * 3 = 1在10 adic土地上,因为向左携带的“ 2”移至无穷大。

对于10-adic数,加法和乘法是有意义的,因为n总和/乘积的最后一位仅取决于n求和/被乘数的最后一位。


给定n,您需要打印n10 adic立方根3 的最后一位,即x满足x*x*x = 3

结束于:

...878683312291648481630318492665160423850087895134587

您的代码必须n=1000在提交之前终止。

假设如果您要打印的数字以零开头,那么您不需要打印前导零,因为实际上并不是打印多余零的点。


这是。以字节为单位的最短答案将获胜。



1
我们是否还需要打印前导零?大多数答案(包括我的Java答案)当前都无法解决这些问题。即n=12输出87895134587代替087895134587。个人而言,我会让它可选的,因为它会失效几乎所有的答案..
凯文Cruijssen

@KevinCruijssen完成了
Leaky Nun

Answers:


26

Python 2,33个字节

lambda k:pow(3,10**k*2/3+1,10**k)

在线尝试!

pow函数有效地计算了模指数3**(10**k*2/3+1)%10**k

我们被要求找到的解决方案r**3 = 3 (mod 10**k)。我们想要找到一个e与映射x -> x**e相反的指数,以求出x -> x**3工作模型10**k,就像RSA中的解密和加密指数抵消以产生原始值一样。这意味着(x**3)**e = x (mod 10**k)所有人x。(我们将在整个过程中进行假设gcd(x,10) = 1。)然后,我们可以r通过反转获得的方法来进行恢复r = 3**e (mod 10**k)

扩展(r**3)**e = r (mod 10**k),我们得到

r**(3*e-1) = 1 (mod 10**k)

我们正在寻找一种指数3*e-1,该指数可保证将那么多份副本相乘即可得到1

模乘10**k构成一个可逆数的组,即具有的那些gcd(x,10) = 1。根据拉格朗日定理,组中元素的数量x**c = 1在哪里c。对于模群N,该计数为Euler拉伸值φ(N),从1到的值的数量N相对于N。因此,我们有 r**φ(10**k) = 1 (mod 10**k)。因此,其足以为3*e-1的倍数φ(10**k)

我们计算

φ(10**k) = φ(5**k) φ(2**k)= 4 * 5**(k-1) * 2**(k-1) = 4 * 10**(k-1)`

因此,我们想3*e-1成为4 * 10**(k-1)

3*e - 1 = r * 4 * 10**(k-1)
e = (4r * 10**(k-1) + 1)/3

可能有很多选择r,但r=5给出了简短的表达

e = (2 * 10**k + 1)/3

e整数。用地板分割打一点高尔夫球会缩短e10**k*2/3+1,并且表达r = 3**e (mod 10**k)出预期的结果r


1
我希望看到有关其工作原理的更详细说明,非常好的答案!
Kritixi Lithos

应该(r**3)**e = x (mod 10**k)(r**3)**e = r (mod 10**k)?也是巧合(2 * 10**k + 1)/3 = 1/3 (mod 10**k)吗?
H.PWiz

@ H.PWiz是的,谢谢,我修复了它。我不确定3的倒数是否是巧合。这当然是不够的,因为用其他值替换2无效。
xnor18年

@xnor我认为就足够了。您应该可以2用任意数字替换x = 2 (mod 3)
H.PWiz

和往常一样,数学赢了!
奥利维尔·格雷戈尔

18

Python 2(PyPy)55 50字节

-5个字节感谢@HP Wiz

n=p=1;exec"p*=10;n+=3*(3-n**3)%p;"*input();print n

在线尝试!

逐位计算(非强制)数字,因此它比蛮力要快。

没有exec的版本

说明

(感谢@Leaky Nun@ user202729弄清楚了这一点)

首先,观察它n**3是对乘模10(即,如果调用了函数f,则f(f(n)) == n)。可以使用详尽搜索来确认。

我们可以使用数学归纳法找到下一个数字。
让是数个数字(右一)。dnn

d 1 3 ≡3(MOD 10)
 d 1 ≡3 3(MOD 10)
    ≡27(mod 10)
    ≡7(mod 10)

现在,假设我们知道k第一个数字,x

              X 3 ≡3(MOD 10 ķ)
  (d K + 1 ·10 ķ + x)的3 ≡3(MOD 10 K + 1)
3·d k + 1 x 2 ·10 k + x 3 3(mod 10 k + 1)(二项式展开。)
(请注意,其他两个项可以忽略,因为它们是0 mod 10 k + 1)
3·d k + 1 x 2 ·10 k + x 3 3(模数10 k + 1

我们知道:

       x≡7(mod 10)
      X 2 ≡49(MOD 10)
         ≡9(mod 10)
  X 2 ·10 ķ ≡9·10 ķ   (MOD 10 K + 1)
3·X 2 ·10 ķ ≡27·10 ķ(MOD 10 K + 1)
         ≡7·10 k   (mod 10 k + 1

替换为:

3·d k + 1 x 2 ·10 k + x 3 3(模数10 k + 1)
  7·d k + 1 ·10 k + x 3 3(模10 k + 1)
             d k + 1≡(3-x 3)÷(7·10 k)(mod 10)
                 ≡(3-x 3)÷(7·10 k)(mod 10)
           ∴d k + 1 ·3·(3-x 3)÷10 k    (mod 10)(3是7 mod 10的倒数)

实际上,该解决方案可能是最佳的。(对于大多数语言,其公式不如强行使用那么冗长)可以在聊天中的某处找到解释,尽管该解释很分散。
user202729

如果你的目的是高尔夫“非高管”的解决方案,作品为62个字节作为一个完整的程序,而不是一个功能
Xcoder先生

这只会11显示n=12和的最后一位数字n=13
Emigna

4
在某些字体中,x和x看起来确实非常相似,并且数学运算非常难以阅读。我可以建议使用·(中心点)代替×吗?(而且,显然,拥有MathJax会很好)。
彼得·泰勒



4

05AB1E17 13 字节

7IGD3mN°÷7*θì

@ ASCII-only的Python 2(PyPy)answer的端口。
-4字节,并通过@Emigna修复了前导零的输出的错误,并替换T%N°*+θì

在线尝试。

说明:

7               # Start result-string `r` at '7'
IG              # Loop `N` in the range [1, input)
  D3m           #  `r` to the power 3
       ÷        #  Integer-divided with
     N°         #  10 to the power `N`
        7*      #  Multiplied by 7
          θì    #  Then take the last digit of this, and prepend it to the result `r`
                # Implicitly output result `r` after the loop

HPWiz已经使我的方法打高尔夫球了,而挑战不再需要前导零,那么您也许可以打更多的高尔夫球?
仅ASCII的

仅限@ASCII,也许,但不确定如何。@Emigna已经为我着迷T%N°*+θì,采用这种方法,领先的零“修复”只是一个不错的选择。
凯文·克鲁伊森

4

爪哇8,158个 156 141 136 135字节

n->{var t=n.valueOf(3);var r=n.ONE;for(int i=0;i++<n.intValue();)r=r.add(t.subtract(r.pow(3)).multiply(t).mod(n.TEN.pow(i)));return r;}

@ ASCII-only的Python 2(PyPy)answer的端口。
-2个字节感谢@Neil
-20字节,感谢@ ASCII-only

注意:@OlivierGrégoire已经使用使用的算法方法将Java答案缩短很多modPow

在线尝试。

说明:

n->{                            // Method with BigInteger as both parameter and return-type
  var t=n.valueOf(3);           //  Temp BigInteger with value 3
  var r=n.ONE;                  //  Result-BigInteger, starting at 1
  for(int i=0;i++<n.intValue();)//  Loop `i` in the range [1, n]
    r=r.add(                    //   Add to the result-BigDecimal:
       t.subtract(r.pow(3))     //    `t` subtracted with `r` to the power 3
       .multiply(t)             //    Multiplied by 3
       .mod(n.TEN.pow(i)));     //    Modulo by 10 to the power `i`
  return r;}                    //  Return the result-BigInteger

哦,您也使用了该算法?我将回滚我的答案并添加您的更改;)
OlivierGrégoire18年

java.math.BigInteger u=null,r=u.valueOf(7),t=r;
尼尔

@Neil当然..谢谢。我java.math.BigInteger t=null,r=u.valueOf(7);t=r;最初在添加之前u先保存了一些字节。
凯文·克鲁伊森

1

1
* modpow,不是modpod:P
仅限ASCII

4

Java(JDK 10),106字节

n->n.valueOf(3).modPow(n.valueOf(2).multiply(n=n.TEN.pow(n.intValue())).divide(n.valueOf(3)).add(n.ONE),n)

在线尝试!

学分


1
通过将循环for(int l=0,d;++l<=n;更改BigInteger I=null;166字节并更改为var I=new BigInteger("3");可以重复使用的字节
凯文·克鲁伊森

1
通过将循环更改为可以节省1个字节for(int l=0,d;l++<n;)
凯文·克鲁伊森




1

Pyth,23个字节

当然,这使用仅ASCII的方法。

K7em=+K*%*7/^K3J^TdTJtU

在这里尝试!


1
@DigitalTrauma哦> _ <我发誓我没有注意到您的回答大声笑...我首先有一个ASCII解决方案的端口,然后我看到了xnor的解决方案,然后将其直接移植到golf上:PI猜测我会回滚到初始版本不过。
Xcoder先生18年

1

木炭26 22字节

≔⁷ηFN≧⁺﹪׳⁻³Xη³Xχ⊕ιηIη

在线尝试!链接是详细版本的代码。说明:

≔⁷η

将结果初始化为7。(不必为7,但是0无效。)

FN

循环输入所需位数。

        η       Current result.
       X ³     Take the cube. 
     ⁻³         Subtract from 3.
   ׳           Multiply by 3.
            ⊕ι  Increment the loop index.
          Xχ    Get that power of 10.
  ﹪             Modulo
≧⁺            η Add to the result.

现在使用@HPWiz的方法来保存4个字节。

Iη

打印结果。

这是一个28字节的蛮力版本,它采用任意值的立方根:

FN⊞υ⊟Φχ¬﹪⁻XI⁺κ⭆⮌υμ³IηXχ⊕ι↓Iυ

在线尝试!链接是详细版本的代码。第一个输入是数字位数,第二个输入是根值。


HPWiz已更新(阅读:打高尔夫球)我的方法。另外,由于Leaky Nun更新了要求,因此不再需要stringmap。同样,第一个链接也指向蛮力版本> _>
仅ASCII的

仅限@ASCII,谢谢,我已经修复了链接并移植了HPWiz的方法,但是我需要StringMap k与反向列表连接起来,以10为基数。
尼尔

嗯 我本以为仅以简单数字方式进行操作可能会更加熟练。我想不是
仅使用ASCII的

@only ASCII对于我以前使用的版本,Base(Reverse(u), 10)但前缀k将花费4个字节,而作为字符串仅花费2个字节,考虑Cast到这一点后可节省1个字节。
尼尔


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.