GolfScript (23 karakter)
{:^((1${\.**2^?%}+*}:f;
Var olmayan bir tersin nöbetçi sonucu budur 0.
Bu, Euler teoreminin basit bir uygulamasıdır . , yanixφ ( 2n)≡ 1( mod2n)x- 1≡ x2n - 1- 1( mod2n)
Ne yazık ki bu doğrudan hesaplamak için çok büyük bir üstel, bu yüzden bir döngü kullanmalı ve döngü içinde modüler azaltma yapmalıyız. Yinelemeli adım ve temel durum bir seçim: ya ilex2k-1= ( x2k -1-1)2× xk=1
{1\:^(@{\.**2^?%}+*}:f;
veya k=2ile
{:^((1${\.**2^?%}+*}:f;
Başka bir yaklaşım üzerinde çalışıyorum, ancak nöbetçi daha zor.
Temel gözlem, tersi inşa edebilmemizdir: sonra ve eğer garip Elimizdeki . (Eğer ikna değilseniz, iki vakayı ayrı ayrı kontrol edin). Böylece herhangi bir uygun temel durumda başlayabilir ve dönüşümünü uygun sayıda uygulayabiliriz .x y≡ 1( mod2k - 1)x y∈ { 1 , 1 + 2k - 1}( mod2k)xx ( y+ x y- 1 ) ≡ 1( mod2k)y'= ( x + 1 ) y- 1
beri indüksiyonla0 x ≡ 1( mod20)
x ( 1 - ( x + 1 )nx) ≡1( mod2n)
burada tersi geometrik dizinin toplamıdır. Şapkadan tavşan efektinden kaçınmak için derivasyonu gösterdim: bu ifade verildiğinde bunu görmek kolaydır (köşeli parantez değerinin bir tamsayı toplamı olarak türetilmesinden sonra gelen bir tam sayı olduğu göz önüne alındığında) sekans) eşitse soldaki ürün doğru eşdeğerlik sınıfında olmalıdır .x + 1
19 karakterlik fonksiyon
{1$)1$?@/~)2@?%}:f;
tersi olan girdiler için doğru cevaplar verir. Ancak, eşit olduğunda o kadar da basit değildir . Bulduğum potansiyel olarak ilginç bir seçenek, eklemek yerine eklemek .xx&11
{1$.1&+1$?@/~)2@?%}:f;
Bu, veya sentinel değerleri veriyor gibi görünüyor , ancak henüz bunu kanıtlamadım.02n - 1
Bundan başka bir adım, biz bir sentinel sağlamak olabilir alarak ekspresyonunu değiştirerek çift sayı için içine :01 - ( x + 1 )n1 - 1n
{1$.1&*)1$?@/~)2@?%}:f;
Bu, kod uzunluğu için Euler teoreminin doğrudan uygulanmasına bağlıdır, ancak büyük için daha kötü performans gösterecektir . Eğer argümanları başka bir yoldan alırsak, bir karakteri kaydedebilir ve 22 karakter elde edebiliriz :nn x f
{..1&*)2$?\/~)2@?%}:f;