73663


短くなりますか？ よろしくお願いします。

[code]

    def My_is_square(x):
        myDic=factorint(x)
        i=0
        for k, v in myDic.items():
            if v % 2 == 0:
               i=i+1
        if i == len(myDic):
           return True
        else:
          return False
    
    from sympy import *
    print("  9",My_is_square(  9))
    print(" 80",My_is_square( 80))
    print(" 81",My_is_square( 81))
    print("400",My_is_square(400))
    #   9 True
    #  80 False
    #  81 True
    # 400 True
    
[/code]

(2021-01-30) 追加

[code]

    print("  1",My_is_square(  1))
    print("  0",My_is_square(  0))
    print(" -3",My_is_square( -3))
    print(" -4",My_is_square( -4))
    #  1 True
    #  0 True
    # -3 False
    # -4 False
    
[/code]

(参考)Wolfram|Alpha  
1は平方数ですか  
[https://www.wolframalpha.com/input/?i=1%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja](https://www.wolframalpha.com/input/?i=1%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja)  
1は完全平方数です

0は平方数ですか  
[https://www.wolframalpha.com/input/?i=0%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja](https://www.wolframalpha.com/input/?i=0%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja)  
0は完全平方数です

-3は平方数ですか  
[https://www.wolframalpha.com/input/?i=-3%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja](https://www.wolframalpha.com/input/?i=-3%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja)  
-3は完全平方数ではありません

-4は平方数ですか  
[https://www.wolframalpha.com/input/?i=-4%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja](https://www.wolframalpha.com/input/?i=-4%E3%81%AF%E5%B9%B3%E6%96%B9%E6%95%B0%E3%81%A7%E3%81%99%E3%81%8B&lang=ja)  
-4は完全平方数ではありません


CC BY-SA 4.0
2021-01-28T13:15:46.197
73657
2021-01-29T23:15:41.540
2021-01-29T23:15:41.540
17199
17199
question
sympy
sympy に平方数を判定する is_square がありますが、factorint で一行でできますか？


すべて(の値)が偶数か を調べるといいので, 次のようにできます

[code]

    for n in (9,80,81,400):
      issqr = all(v %2 == 0 for v in factorint(n).values())
      print(f'{n:3}, {My_is_square(n)}, {issqr}')
    
[/code]

* * *

わかりにくいようなので, 抜粋します

[code]

    issqr = all(v %2 == 0 for v in factorint(n).values())
    
[/code]

これを関数にしたければ

[code]

    def issqr(n):
      return all(v %2 == 0 for v in factorint(n).values())
    
[/code]

(コメントにあるような '0' or '1' の処理は省いています)


CC BY-SA 4.0
2021-01-28T13:54:11.080
73661
2021-01-28T14:30:52.733
2021-01-28T14:30:52.733
43025
43025
73657
answer


一応、題目が「is_square がありますが、factorintで一行でできますか？」なので、返却値を
[sympy.ntheory.primetest.is_square](https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.primetest.is_square)([source
code](https://github.com/sympy/sympy/blob/9e8f62e059d83178c1d8a1e19acac5473bdbf1c1/sympy/ntheory/primetest.py#L59))
に合わせてみます。

[code]

    def My_is_square(x):
      return True if x in (0, 1) else all(y%2==0 for y in factorint(x).values())
    
[/code]

以下、[sympy.ntheory.factor_.factorint](https://docs.sympy.org/latest/modules/ntheory.html#sympy.ntheory.factor_.factorint)
からの抜粋です。

> For input less than 2, factorint behaves as follows:
>
>   * factorint(1) returns the empty factorization, {}
>   * factorint(0) returns {0:1}
>   * factorint(-n) adds -1:1 to the factors and then factors n
>


CC BY-SA 4.0
2021-01-28T14:44:52.347
73663
2021-01-28T14:44:52.347
73657
answer