2013-04-04 31 views
5

JavaScript'te basit bir algoritma uygulamaya çalışıyorum. Baktığım her yerde, kodun 1 (mod N) çalışması gerekiyor. Anlatabildiğim kadarıyla, 1 modulo bir şey (veya 1%N) 1'dir.1 (mod N) ne anlama geliyor?

Neler eksik? Her zaman 1 mi, eğer öyleyse, neden sadece 1 kullanmıyorsunuz?

x ≡ 1 (mod N) # x is congruent to 1 (modulo N) 

(mod N) ve üçlü eşittir sen modüler aritmetik, normal aritmetik birlikte çalışıyoruz göstermek oturum:

+2

"1 modülo herhangi bir şey (ya da% 1 K) 1'dir" - olmadıkça N, 1'dir, bu durumda sonuç sıfırdır. –

+0

Anlaşılması gereken en önemli şey, matematiksel notasyonda, '(mod n)' nin, bir ifadenin her iki yüzüne de uygulanabilmesidir, hatta bile sadece sağ tarafta yazılmıştır (bkz. [Modüler gösterimler hakkında karışık] (http://math.stackexchange.com/questions/78367/confused-about-modular-notations)). Yani, Blender'ın yanıtı, 'a ≡ 1 (mod N)' ifadesi, sistem " '' modulo N' alındığında" ya da "a% N == 1" şeklinde okunmalıdır. % N' (ya da sadece% 1 = N = 1, çünkü% 1 N = her zaman 1'e eşittir). – sevko

cevap

9

algoritması muhtemelen gibi bir şey söylüyor. Bir saatin elleri gibi düşün. Modüler aritmetikte x ≡ 1, x ve 1'un aynı residue class'a ait olduğu anlamına gelir. N saat bölümleri olan bir saatiniz varsa, 1 zamanını veya x zamanını döndürerek elinizi aynı son konuma getirecektir. x negatif asla ise özel durum için

, x ≡ 1 (mod N) JavaScript içinde x % N === 1 olarak temsil edilebilir. Aksi takdirde, eşitliğiniz, aşağıdaki gibi olsa bile, tutmaz: -1 ≡ 1 (mod 2) ancak (-1) % 2 === -1, 1, eşittir, bunlar modüler aritmetik anlamda "eşit" olsalar bile. Eğer negatif olmak x bekliyorsanız

, sadece uyum ilişkisini yeniden düzenleyebilirsiniz:

 x ≡ 1 (mod N) 
⇒ x - 1 ≡ 0 (mod N) 

x - 10 için uyumlu olma güvenle modülo operatörünü kullanabilirsiniz yüzden, N kendisi tarafından bölünebilir demektir:

if ((x - 1) % N === 0) { 
    ... 
} 
+1

Açıklığa kavuşturmak için: 'x ≡ 1 (mod N)' * * * x% N ==% 1 N *, x% N == 1 'yi basitleştirmektedir, çünkü '% 1 N == 1' çünkü (varsayarak) 'N' 1 değil. – sevko

1

Modulo (%) işleci nasıl çalışır? ECMA-262 §11.5.3. Peki modülo operatörünün bağlam olmadan yüzen için

1 % -Infinity returns 1 
... 
1 % -2 returns 1 
1 % -1 returns 0 
1 % 0 returns NaN 
1 % 1 returns 0 
1 % 2 returns 1 
... 
1 % Infinity returns 1 

,

1 % -1.1 returns 1 
1 % 0.1 returns 0.09999999999999995 
1 % 0.6 returns 0.4 
1 % 0.5 returns 0 
1 % 0.4 returns 0.19999999999999996 
1 % 0.9 returns 0.09999999999999998 
1 % 1.1 returns 1 

: tamsayıları için

: Birkaç tuhaflıklar vardır, ECMAScript modülo operatör yüzen hem de tamsayılar kabul uygulanıyor, neden kullanıldığını belirlemek çok zor. Hepsinden iyisi kodun belgelenmesi olurdu, ama sanırım bu mevcut değil. böylece gerçek 0 ve 1 olarak yanlış ve her şey değerlendirmek için bir tamsayı beklenen kullanımıdır

biri,:

if (1 % n) { 
    // do this if n is something other than 0 or 1 
}