Công thức tính đồng quy


10

Các Phần còn lại của Trung Quốc Định lý có thể khá hữu ích trong số học modula.

Ví dụ, hãy xem xét các tập hợp quan hệ đồng dư sau đây:

Tập hợp

Đối với các tập hợp quan hệ đồng dạng như thế này, trong đó tất cả các cơ sở ( 3, 5, 7trong ví dụ này) là đồng nguyên tố với nhau, sẽ có một và chỉ một số nguyên ngiữa 1và tích của các cơ sở ( 3*5*7 = 105trong ví dụ này) bao gồm thỏa mãn các quan hệ .

Trong ví dụ này, số sẽ được 14tạo bởi công thức này:

công thức

nơi 2, 4, and 0được đưa ra từ ví dụ trên.

70, 21, 15là các hệ số của công thức và chúng phụ thuộc vào các cơ sở , 3, 5, 7.

Để tính các hệ số của công thức ( 70, 21, 15trong ví dụ của chúng tôi) cho một tập hợp các cơ sở, chúng tôi sử dụng quy trình sau.

Đối với mỗi số atrong một tập hợp các cơ sở:

  1. Tìm sản phẩm của tất cả các cơ sở khác, ký hiệu là P.
  2. Tìm bội số đầu tiên Pđể lại phần còn lại 1khi chia cho a. Đây là hệ số của a.

Ví dụ, để tính hệ số tương ứng với cơ sở 3, chúng ta tìm sản phẩm của tất cả các cơ sở khác (nghĩa là 5*7 = 35) và sau đó tìm bội số đầu tiên của sản phẩm đó để lại phần còn lại 1khi chia cho cơ sở.

Trong trường hợp này, 35để lại một phần còn lại 2khi chia cho 3, nhưng 35*2 = 70để lại phần còn lại 1khi chia cho 3, thì 70hệ số tương ứng cho 3. Tương tự, 3*7 = 21để lại một phần còn lại 1khi chia cho 53*5 = 15để lại phần còn lại 1khi chia cho 7.

Tóm lại

Đối với mỗi số atrong một bộ số:

  1. Tìm tích của tất cả các số khác, ký hiệu là P.
  2. Tìm bội số đầu tiên Pđể lại phần còn lại 1khi chia cho a. Đây là hệ số của a.

Các thách thức

  • Thách thức là, đối với một tập hợp gồm hai hoặc nhiều cơ sở, để tìm tập hợp các hệ số tương ứng.
  • Tập hợp các cơ sở được đảm bảo là đồng nguyên tố và mỗi cơ sở được đảm bảo lớn hơn 1.
  • Đầu vào của bạn là một danh sách các số nguyên dưới dạng đầu vào [3,4,5]hoặc chuỗi được phân tách bằng dấu cách "3 4 5"hoặc tuy nhiên đầu vào của bạn hoạt động.
  • Đầu ra của bạn phải là một danh sách các số nguyên hoặc chuỗi được phân tách bằng dấu cách biểu thị tập hợp các hệ số.

Các trường hợp thử nghiệm

input             output
[3,5,7]           [70,21,15]
[2,3,5]           [15,10,6]
[3,4,5]           [40,45,36]
[3,4]             [4,9]
[2,3,5,7]         [105,70,126,120]
[40,27,11]        [9801,7480,6480]
[100,27,31]       [61101,49600,56700]
[16,27,25,49,11]  [363825,2371600,2794176,5583600,529200]

Rất cám ơn Leaky Nun đã giúp đỡ trong việc viết thử thách này. Như mọi khi, nếu vấn đề không rõ ràng, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!


Sẽ luôn có 3 số trong đầu vào?
xnor

@xnor Không. Kiểm tra trường hợp chỉnh sửa.
Sherlock9

Câu trả lời:


5

Haskell, 61 55 53 byte

f x=[[p|p<-[0,product x`div`n..],p`mod`n==1]!!0|n<-x]

Xác định hàm flấy đầu vào và đưa ra đầu ra dưới dạng danh sách các số nguyên.

f x=[                                          |n<-x]  (1)
              product x                                (2)
                       `div`n                          (3)

Đầu tiên chúng ta lặp qua tất cả các số nguyên trong đầu vào (1). Sau đó, chúng tôi lấy tích của tất cả các số nguyên (2) và chia cho n để chỉ lấy tích của các nsố nguyên, đó là P(3).

           [0,               ..]                       (4)
     [p|p<-                     ,p`mod`n==1]           (5)
                                            !!0        (6)

Sau đó, chúng tôi sử dụng kết quả ( P) làm giá trị bước cho một phạm vi bắt đầu từ 0 (4). Chúng tôi lấy kết quả [0, P, 2P, 3P, ...]và lọc nó trên các giá trị mà kết quả của thao tác mod-n là một (5). Cuối cùng, chúng tôi lấy yếu tố đầu tiên, hoạt động nhờ đánh giá lười biếng (6).

Cảm ơn @xnor cho 2 byte!


1
Chào mừng bạn đến với haskell! Tôi nghĩ rằng bạn quotcó thể là một div, và headcó thể !!0.
xnor

4

Thạch , 11 7 byte

P:*ÆṪ%P

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Lý lịch

Hãy Pmột được nghiêm chỉnh tích cực, nguyên tố cùng nhau số nguyên.

Quá trình hai bước trong câu hỏi - tìm bội số P để lại phần dư 1 khi chia cho a - có thể được mô tả bằng phương trình đồng quy sau.

phương trình đồng dư tuyến tính

Theo định lý Euler-Fermat , chúng ta có

Định lý Euler-Fermat

trong đó φ biểu thị hàm toàn phần của Euler . Từ kết quả này, chúng tôi suy luận như sau.

công thức cho phương trình đồng dư tuyến tính

Cuối cùng, vì thử thách yêu cầu chúng tôi tính toán Px , chúng tôi quan sát thấy rằng

công thức cho kết quả cuối cùng

Trong đó Pa có thể được tính là sản phẩm của tất cả các mô đun.

Làm thế nào nó hoạt động

P:*ÆṪ%P  Main link. Argument: A (list of moduli)

P        Yield the product of all moduli.
 :       Divide the product by each modulus in A.
   ÆṪ    Apply Euler's totient function to each modulus.
  *      Raise each quotient to the totient of its denominator.
     %P  Compute the remainder of the powers and the product of all moduli.

2

J, 13 byte

*/|5&p:^~*/%]

Dựa trên câu trả lời tuyệt vời của @Dennis .

Sử dụng

Một số trường hợp kiểm tra sẽ cần đầu vào là số nguyên mở rộng có hậu tố x.

   f =: */|5&p:^~*/%]
   f 3 5 7
70 21 15
   f 40x 27 11
9801 7480 6480
   f 16x 27 25 49 11
363825 2371600 2794176 5583600 529200

Giải trình

*/|5&p:^~*/%]  Input: list B
         */    Reduce B using multiplication to get the product of the values
            ]  Identity function, get B
           %   Divide the product by each value in B, call the result M
   5&p:        Apply the totient function to each value in B, call the result P
       ^~      Raise each value in M to the power of its corresponding value in P
*/             The product of the values in B
  |            Compute each power modulo the product and return

Hãy thử nó ở đây.




1

Thạch, 14 13 byte

P:×"Ḷð%"’¬æ.ḷ

Đã lưu một byte nhờ @ Dennis !

Sử dụng quy trình được mô tả trong thông số kỹ thuật thách thức. Đầu vào là danh sách các cơ sở và đầu ra là danh sách các hệ số.

Hãy thử trực tuyến hoặc Xác minh tất cả các trường hợp thử nghiệm .

Giải trình

P:×"Ḷð%"’¬æ.ḷ  Input: a list B
P              Get the product of the list
 :             Divide it by each value in the B, call it M
    Ḷ          Get a range from 0 to k for k in B
  ×"           Vectorized multiply, find the multiples of each M
     ð         Start a new dyadic chain. Input: multiples of M and B
      %"       Vectorized modulo, find the remainders of each multiple by B
        ’      Decrement every value
               If the remainder was 1, decrementing would make it 0
         ¬     Logical NOT, zeros become one and everything else becomes 0
            ḷ  Get the multiples of M
          æ.   Find the dot product between the modified remainders and the multiples
               Return

1

JavaScript (ES6), 80 byte

a.map(e=>[...Array(e).keys()].find(i=>p*i/e%e==1)*p/e,p=a.reduce((i,j)=>i*j))

Tôi đã thử thuật toán Euclide mở rộng nhưng phải mất 98 byte:

a=>a.map(e=>(r(e,p/e)+e)%e*p/e,p=a.reduce((i,j)=>i*j),r=(a,b,o=0,l=1)=>b?r(b,a%b,t,o-l*(a/b|0)):o)

Nếu tất cả các giá trị là số nguyên tố, ES7 có thể thực hiện trong 56 byte:

a=>a.map(e=>(p/e%e)**(e-2)%e*p/e,p=a.reduce((i,j)=>i*j))

1

Python + SymPy, 71 byte

from sympy import*
lambda x:[(prod(x)/n)**totient(n)%prod(x)for n in x]

Điều này sử dụng thuật toán từ câu trả lời Jelly của tôi . I / O ở dạng danh sách các số SymPy.


1

Python 2, 87 84 byte

Một thực hiện đơn giản của thuật toán. Gợi ý chơi golf chào mừng.

a=input();p=1
for i in a:p*=i
print[p/i*j for i in a for j in range(i)if p/i*j%i==1]

Một chương trình đầy đủ sẽ tiết kiệm 3 byte.
Dennis


0

GAP , 51 byte

GAP có một chức năng có thể tính toán ví dụ tạo động lực ChineseRem([2,5,7],[2,4,0]), nhưng điều đó vẫn không làm cho nó dễ dàng có được các hệ số. Chúng ta có thể lấy hệ số thứ n bằng cách sử dụng danh sách với một ở vị trí thứ n và các số 0 ở các vị trí khác làm đối số thứ hai. Vì vậy, chúng ta cần tạo các danh sách này và áp dụng hàm cho tất cả chúng:

l->List(Basis(Integers^Size(l)),b->ChineseRem(l,b))

0

Mẻ, 148 byte

@set p=%*
@set/ap=%p: =*%
@for %%e in (%*)do @for /l %%i in (1,1,%%e)do @call:l %%e %%i
@exit/b
:l
@set/an=p/%1*%2,r=n%%%1
@if %r%==1 echo %n%

0

Trên thực tế, 14 byte

Điều này sử dụng thuật toán trong câu trả lời Jelly của Dennis . Một câu trả lời khác dựa trên câu trả lời Python của tôi sắp được đưa ra. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

;π;)♀\;♂▒@♀ⁿ♀%

Làm thế nào nó hoạt động

                 Implicit input a.
;                Duplicate a.
 π;)             Take product() of a, duplicate and rotate to bottom.
    ♀\           Integer divide the product by each element of a. Call this list b.
      ;♂▒        Take that list, duplicate, and get the totient of each element.
         @♀ⁿ     Swap and take pow(<item in b>, <corresponding totient>)
            ♀%   Modulo each item by the remaining duplicate product on the stack.
                 Implicit return.

Một câu trả lời khác dựa trên câu trả lời Python của tôi ở 22 byte. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

;π╖`╝╛╜\╛r*"╛@%1="£░`M

Làm thế nào nó hoạt động

            Implicit input a.
;π╖         Duplicate, take product of a, and save to register 0.
`...`M      Map over a.
  ╝           Save the item, b, in register 1.
  ╛╜\         product(a) // b. Call it P.
  ╛r          Take the range [0...b].
  *           Multiply even item in the range by P. Call this list x.
  "..."£░     Turn a string into a function f.
              Push values of [b] where f returns a truthy value.
    ╛@%         Push b, swap, and push <item in x> % b.
    1=          Does <item> % b == 1?
            Implicit return.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.