줄리아에서 배열, 조합, 원형 배열, 염주 배열을 시도해 보세요!

76875 단어 Juliamathidea

개시하다


트위터에는 젠의 쥬리아와 관련된 내용이 떠돌고 있다.
https://zenn.dev/ohno/articles/03e65bfa028baa
이것은 모든 목록을 배열하고 조합해서 만드는 프로그램입니다.(Shuhei Ohno)
엔화와 염주로'누가 댓글을 달아주세요!'"이거 해야 돼!"그렇게 생각하고 했어요.

목록이 같은 내용을 포함한다면


Shuhei Ohno씨의 코드를 보고 생각했는데 [1,1,2,3,4] 등 같은 것을 포함하는 배열·조합 등이 지원되지 않아서 확인하고 싶었어요.

정렬


우선 포장Combinatorics.jl을 사용합니다.

정렬(동일 제외)


using Combinatorics
seq = [1, 2, 3, 4, 5]
p = union(permutations(seq, 3)) 
# 順列(同じものでもOK)この例は集合から3個とって1列に並べる。
60-element Vector{Vector{Int64}}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 2]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 2]
 [1, 4, 3]
 [1, 4, 5]
 [1, 5, 2][5, 2, 1]
 [5, 2, 3]
 [5, 2, 4]
 [5, 3, 1]
 [5, 3, 2]
 [5, 3, 4]
 [5, 4, 1]
 [5, 4, 2]
 [5, 4, 3]
개수도 나와 60개!

정렬(동일 포함)


같은 것을 포함하는 순서대로 해 보세요.
seq2 = [1, 1, 1, 2, 2, 3]
p2 = union(permutations(seq2, 3)) 
19-element Vector{Vector{Int64}}:
 [1, 1, 1]
 [1, 1, 2]
 [1, 1, 3]
 [1, 2, 1]
 [1, 2, 2]
 [1, 2, 3]
 [1, 3, 1]
 [1, 3, 2]
 [2, 1, 1]
 [2, 1, 2]
 [2, 1, 3]
 [2, 2, 1]
 [2, 2, 3]
 [2, 3, 1]
 [2, 3, 2]
 [3, 1, 1]
 [3, 1, 2]
 [3, 2, 1]
 [3, 2, 2]
19개.

콤비네이션


다음은 팀.

조합(동일 제외)


seq = [1, 2, 3, 4, 5]
c = union(combinations(seq, 3)) 
# 組み合わせ(同じものでもOK)この例は集合から3個とってくる組み合わせ。
10-element Vector{Any}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]
{}_5\text{C}_3 = 10개.

조합(동일 포함)


그렇다면 같은 것을 포함하는 경우다.
seq2 = [1, 1, 1, 2, 2, 3]
c = union(combinations(seq2, 3)) 
# 組み合わせ(同じものでもOK)この例は集合から3個とってくる組み合わせ。
6-element Vector{Any}:
 [1, 1, 1]
 [1, 1, 2]
 [1, 1, 3]
 [1, 2, 2]
 [1, 2, 3]
 [2, 2, 3]
6개.고등학교 수학 교과서 등 예제는'나무그림으로 생각해라!'되다

원형 배열


그럼 엔화로 배열해 주세요.나는 일찍이 공식을 운용하여 '같은 물건을 포함하는 엔화의 배열 총수' 를 계산한 적이 있다.
https://zenn.dev/dannchu/articles/2a27581585a338
이번에 나는 실제적으로 그 명세서를 찾을 것이다.지난번 결과와 일치하는지 확인하고 싶습니다.
이번 방침은요.
!
대상 열의 경우 다음에 따라 이동하여 일치하는 항목을 제거합니다.
네.적당히union에서 중복을 제거하세요.

원형 정렬(동일 제외)


# 円順列(同じものでもOK)この例は集合から3個とってくる円順列。
function circperm(seq, k)
    p = union(permutations(seq, k))
    n = length(p)
    d = []
    for i = 1:n-1, j = i+1:n, t = 1:k-1
        if p[i] == circshift(p[j], t)
            push!(d, j)
        end
    end
    deleteat!(p, sort!(union!(d)))
end

circperm(seq, 3)
20-element Vector{Vector{Int64}}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 2]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 2]
 [1, 4, 3]
 [1, 4, 5]
 [1, 5, 2]
 [1, 5, 3]
 [1, 5, 4]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 3]
 [2, 4, 5]
 [2, 5, 3]
 [2, 5, 4]
 [3, 4, 5]
 [3, 5, 4]
{}_5\text{C}_3\times\dfrac{3!}{3}=20개는요.

원형 배열(동일 포함)


seq2 = [1, 1, 1, 2, 2,3]
circperm(seq2, 3)
7-element Vector{Vector{Int64}}:
 [1, 1, 1]
 [1, 1, 2]
 [1, 1, 3]
 [1, 2, 2]
 [1, 2, 3]
 [1, 3, 2]
 [2, 2, 3]
7개.
신중을 기하기 위해서 전에 만든 것을 확인해 보겠습니다.
seq3 = [1, 1, 1, 1, 2,2,2,2,2,2]
circperm(seq3, 10)
22-element Vector{Vector{Int64}}:
 [1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
 [1, 1, 1, 2, 1, 2, 2, 2, 2, 2]
 [1, 1, 1, 2, 2, 1, 2, 2, 2, 2]
 [1, 1, 1, 2, 2, 2, 1, 2, 2, 2]
 [1, 1, 1, 2, 2, 2, 2, 1, 2, 2]
 [1, 1, 1, 2, 2, 2, 2, 2, 1, 2]
 [1, 1, 2, 1, 1, 2, 2, 2, 2, 2]
 [1, 1, 2, 1, 2, 1, 2, 2, 2, 2]
 [1, 1, 2, 1, 2, 2, 1, 2, 2, 2]
 [1, 1, 2, 1, 2, 2, 2, 1, 2, 2][1, 1, 2, 2, 1, 2, 2, 1, 2, 2]
 [1, 1, 2, 2, 1, 2, 2, 2, 1, 2]
 [1, 1, 2, 2, 2, 1, 1, 2, 2, 2]
 [1, 1, 2, 2, 2, 1, 2, 1, 2, 2]
 [1, 1, 2, 2, 2, 1, 2, 2, 1, 2]
 [1, 1, 2, 2, 2, 2, 1, 2, 1, 2]
 [1, 2, 1, 2, 1, 2, 1, 2, 2, 2]
 [1, 2, 1, 2, 1, 2, 2, 1, 2, 2]
 [1, 2, 1, 2, 2, 1, 2, 1, 2, 2]
22개.
예전에 만든 코드로 확인한 후,
using Combinatorics #multinomial(a)多項係数を求める
using Primes    #totient(i) オイラーのトーシェント関数

function divisors(n)    #約数のリストを求める関数
   X=[]
   for i=1:n
       if n % i==0
           X =push!(X,i)
       end
   end
   X
end

function enkan(a)
   l=gcd(a)    #リスト(配列)aの最大公約数を求める。
   N=sum(a)    #aの総和
   A=divisors(l)
   p=0
   for k in A
       q=map(x -> x÷k,a) 
       p +=totient(k)*multinomial(q...)
   end
   p÷N
end

enkan([4 6])
22
회!

염주 배열


요즘 젊은이들은 염주를 모르지.불교에서는 장례식 때 손에 든다.
이번 방침은요.
!
원형으로 배열된 목록을 만들고 목표의 열에 대해 아래의 열을 반전시켜 일치하는 내용을 제거한다.
네.이것도 적당히union에서 중복을 제거한다.

염주 배열(동일하지 않음)



# 数珠順列(同じものでもOK)この例は集合から3個とってくる数珠順列。
function ringperm(seq, k)
   p = circperm(seq, k)
   n = length(p)
   d = []
   for i = 1:n-1, j = i+1:n, t = 1:k-1
       if p[i] == circshift(reverse(p[j]),t)
           push!(d, j)
       end
   end
   deleteat!(p, sort!(union!(d)))
end

ringperm(seq, 3)
10-element Vector{Vector{Int64}}:
 [1, 2, 3]
 [1, 2, 4]
 [1, 2, 5]
 [1, 3, 4]
 [1, 3, 5]
 [1, 4, 5]
 [2, 3, 4]
 [2, 3, 5]
 [2, 4, 5]
 [3, 4, 5]
{}_5\text{C}_3\times\dfrac{3!}{3}\times2=10개.

염주 배열(동일 포함)


나는 별로 해 본 적이 없다.수량이 많다는 생각만 해도 쉽지 않다.
보통 반대로 똑같이 변하고 2로 나누는 것을 고려한다.같은 것이 포함되지 않으면 반드시 한 쌍이 존재하기 때문에 간단하게 2로 나누면 된다.
seq2 = [1, 1, 1, 2, 2,3]
ringperm(seq2, 3)
6-element Vector{Vector{Int64}}:
 [1, 1, 1]
 [1, 1, 2]
 [1, 1, 3]
 [1, 2, 2]
 [1, 2, 3]
 [2, 2, 3]
6개.엔화 배열은 7개였지만 전혀 줄어들지 않았다.7개 중 5개는 자기가 뒤집은 것이고,[1, 2, 3][1, 3, 2]만 한 쌍이다.
예를 하나 더 들겠습니다.
seq3 = [1, 1, 1, 1, 2,2,2,2,2,2]
ringperm(seq3, 10)
16-element Vector{Vector{Int64}}:
 [1, 1, 1, 1, 2, 2, 2, 2, 2, 2]
 [1, 1, 1, 2, 1, 2, 2, 2, 2, 2]
 [1, 1, 1, 2, 2, 1, 2, 2, 2, 2]
 [1, 1, 1, 2, 2, 2, 1, 2, 2, 2]
 [1, 1, 2, 1, 1, 2, 2, 2, 2, 2]
 [1, 1, 2, 1, 2, 1, 2, 2, 2, 2]
 [1, 1, 2, 1, 2, 2, 1, 2, 2, 2]
 [1, 1, 2, 1, 2, 2, 2, 1, 2, 2]
 [1, 1, 2, 1, 2, 2, 2, 2, 1, 2]
 [1, 1, 2, 2, 1, 1, 2, 2, 2, 2]
 [1, 1, 2, 2, 1, 2, 1, 2, 2, 2]
 [1, 1, 2, 2, 1, 2, 2, 1, 2, 2]
 [1, 1, 2, 2, 2, 1, 1, 2, 2, 2]
 [1, 2, 1, 2, 1, 2, 1, 2, 2, 2]
 [1, 2, 1, 2, 1, 2, 2, 1, 2, 2]
 [1, 2, 1, 2, 2, 1, 2, 1, 2, 2]
16개.엔화 배열은 22개다.

좋은 웹페이지 즐겨찾기