74435


問題点① 素因数分解の個数が3個の場合しか対応していません。  
問題点② リスト内包表記の使い方がわかりませんでした。関数部分1行で書けますか。  
問題点③ ( . [ . { 。使い方、変換についての、おすすめのページを教えて下さい。  
よろしくお願いします。

[code]

    from sympy import *
    import itertools
    var('My_Yakusu')
    def My_SoinsuToYakuSu(My_factorint):
        k_list = list(My_factorint.keys())
        v_list = list(My_factorint.values())
        My_list=list(itertools.product(
                     list(range(v_list[0]+1)),
                     list(range(v_list[1]+1)),
                     list(range(v_list[2]+1))))
        My_Yakusu = []
        for i in range(len(My_list)):
            My_Yakusu.append(  k_list[0] ** My_list[i][0] \
                             * k_list[1] ** My_list[i][1] \
                             * k_list[2] ** My_list[i][2] )
        return sorted(My_Yakusu)
    
    print("#sy 90-約数     ",divisors(90, generator=False))
    print("#sy 90-素因数分解",factorint(90))
    print("#my 90-約数     ",My_SoinsuToYakuSu(factorint(90)))
    print("")
    print("#630は、間違っています。")
    print("#sy630-約数     ",divisors(630, generator=False))
    print("#sy630-素因数分解",factorint(630))
    print("#my630-約数     ",My_SoinsuToYakuSu(factorint(630)))
    
    #sy 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    #sy 90-素因数分解 {2: 1, 3: 2, 5: 1}
    #my 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
    #630は、間違っています。
    #sy630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    #sy630-素因数分解 {2: 1, 3: 2, 5: 1, 7: 1}
    #my630-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
[/code]


CC BY-SA 4.0
2021-03-05T11:12:18.900
74430
2021-03-09T14:51:37.317
2021-03-09T14:51:37.317
17199
17199
question
python アルゴリズム sympy
素因数分解を約数にする。ループ,組み合わせの方法を教えて下さい。


関数名と変数名を大文字で始めたくはありませんが、提示されている名前をそのまま使用した My_SoinsuToYakuSu のサンプルコードです。  
My_factorint は {2: 1, 3: 2, 5: 1} のように素因数分解された辞書の前提です。

[code]

    from functools import reduce
    from operator import mul
    
    def My_SoinsuToYakuSu(My_factorint):
        src = reduce(mul, (k**v for k,v in My_factorint.items()))
        return [i for i in range(1, src+1) if src % i == 0]
    
[/code]


CC BY-SA 4.0
2021-03-05T15:48:32.197
74434
2021-03-05T15:48:32.197
41756
74430
answer


> 問題点① 素因数分解の個数が3個の場合しか対応していません。  
>  問題点② リスト内包表記の使い方がわかりませんでした。関数部分1行で書けますか。

※ Python 3.8 以上が必要

[code]

    from itertools import product
    from math import prod
    from sympy import factorint, divisors
    import sys
    
    def My_SoinsuToYakuSu(factordict):
      return sorted([
        prod([k**v[i] for i, k in enumerate(factordict.keys())])
        for v in product(*map(lambda v: range(v+1), factordict.values()))
      ])
    
    if __name__ == '__main__':
      print("#sy 90-約数     ", divisors(90, generator=False))
      print("#sy 90-素因数分解", factorint(90))
      print("#my 90-約数     ", My_SoinsuToYakuSu(factorint(90)))
      print("")
      print("#sy630-約数     ", divisors(630, generator=False))
      print("#sy630-素因数分解", factorint(630))
      print("#my630-約数     ", My_SoinsuToYakuSu(factorint(630)))
    
      ## for testing
      print(divisors(sys.maxsize, generator=False) == My_SoinsuToYakuSu(factorint(sys.maxsize)))
    
    =>
    #sy 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    #sy 90-素因数分解 {2: 1, 3: 2, 5: 1}
    #my 90-約数      [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    
    #sy630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    #sy630-素因数分解 {2: 1, 3: 2, 5: 1, 7: 1}
    #my630-約数      [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    True
    
[/code]


CC BY-SA 4.0
2021-03-05T17:57:38.103
74435
2021-03-05T18:06:16.980
2021-03-05T18:06:16.980
74430
answer


以下は、今の私の実力です。

[code]

    from sympy import *
    import itertools
    def My_SoinsuToYakuSuI(My_keys,My_itemsI):
      ans=1
      for v0 in range(len(My_keys)):
          ans=ans*My_keys[v0]**My_itemsI[v0]
      return ans
    def My_SoinsuToYakuSu(factordict):
      My_SoinI=[]
      for v0 in factordict.values():
          My_SoinI.append(list(range(v0+1)))
      My_Kumi=My_SoinI[0]
      for v0 in range(1,len(My_SoinI)):
          My_Kumi=[flatten([x, y]) for x in My_Kumi for y in My_SoinI[v0]]
      My_Ans=[]
      for v0 in range(0,len(My_Kumi)):
          My_Ans.append(My_SoinsuToYakuSuI(list(factordict.keys()),My_Kumi[v0]))
      return sorted(My_Ans)
    
    if __name__ == '__main__':
      print("# my  90の約数",len(My_SoinsuToYakuSu(factorint( 90))),"個",My_SoinsuToYakuSu(factorint( 90)))
      print("# my 630の約数",len(My_SoinsuToYakuSu(factorint(630))),"個",My_SoinsuToYakuSu(factorint(630)))
    
    # my  90の約数 12 個 [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90]
    # my 630の約数 24 個 [1, 2, 3, 5, 6, 7, 9, 10, 14, 15, 18, 21, 30, 35, 42, 45, 63, 70, 90, 105, 126, 210, 315, 630]
    
[/code]

[https://www.wolframalpha.com/input/?i=630%E3%81%AE%E7%B4%84%E6%95%B0&lang=ja](https://www.wolframalpha.com/input/?i=630%E3%81%AE%E7%B4%84%E6%95%B0&lang=ja)


CC BY-SA 4.0
2021-03-09T13:24:32.283
74554
2021-03-09T13:24:32.283
17199
74430
answer